xargsとvi - "入力が端末から出ていません。"

xargsとvi -

私のシステムには10個ほどのphp.iniファイルが複数の場所に分散していますが、すばやく探してみたいです。私は次のコマンドを試しました。

locate php.ini | xargs vi

しかし、vi警告メッセージが表示Input is not from a terminalされ、コンソールが本当に奇妙に動作し始めます。その後、:q![終了]をクリックしてviからsshセッションを切断して再接続し、コンソールが正しく機能するようにする必要があります。

私はここで何が起こっているのか、ある程度理解していると思います。デフォルトでは、コマンドはvi開始時にまだ完了していないため、コマンドがまだ完了していない可能性があり、端末が通常モードにあるとはvi見なされません。

どのように解決すべきかわかりません。 Googleとunix.stackexchange.comを検索しましたが、運がありませんでした。

ベストアンサー1

この質問は以前に質問されました。法廷。

この質問に対する@grawityの答えを引用すると、次のようになります。

xargsを介してプログラムを呼び出すと、プログラムのstdin(標準入力)は/ dev / nullを指します。 (xargsは生の標準入力について知らないため、次善策しか実行できません。)

Vimは、標準入力が制御端子と同じであると予想し、標準入力から直接さまざまな端末関連ioctlを実行します。 /dev/null (または非 tty ファイル記述子) で実行されると、これらの ioctl は意味がなく、自動的に無視される ENOTTY を返します。

最新バージョンのOS X / macOS / BSDとGNU findutils xargs(次から始まる)v4.6.0-o)この正確なシナリオを解決するオプションがあります。

macOS/BSD のマニュアルページから:

-oコマンドを実行する前に、サブプロセスで/ dev / ttyでstdinを再度開きます。これは、xargsに対話型アプリケーションを実行させる場合に便利です。

そのため、macOSでは次のコマンドを使用できます。

find . -name "php.ini" | xargs -o vim

以前のバージョンのGNUの使用に固執する場合は、xargs次のコマンドが機能します。 (該当する文字列を含める必要があります。dummyそうしないと、最初のファイルは削除されます。)

find . -name "php.ini" | xargs bash -c '</dev/tty vim "$@"' dummy

上記の解決策は丁寧ですJaime McGuiganが語る「パワーユーザー」。今後の訪問者がサイトでこのエラーを検索できるように、ここに追加してください。

おすすめ記事