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が語る「パワーユーザー」。今後の訪問者がサイトでこのエラーを検索できるように、ここに追加してください。

答え2

vi $(locate php.ini)

注:ファイルパスにスペース、タブ、改行(デフォルトは$IFS)またはglob文字が含まれていますが、機能的にはコマンドと似ている場合に問題が発生します(引用符xargsとバックスラッシュを特殊ダッシュ文字として扱いますが処理しません)。 )しかしそうではありません)。
次のバージョンでは、スペース、タブ、グローバル文字を正しく処理しますが、少し複雑です。(ファイル名に改行がある場合はまだ壊れます)

(IFS=$'\n'; set -o noglob; vi $(locate php.ini))

説明する:

何が起こるのかは、プログラムがファイル記述子を生成したプロセスからファイル記述子を継承するということです。xargsSTDINはSTDOUTに接続されているため、locate元のviSTDINがどこにあるのかわかりません。

答え3

GNUfindutilsとプロセスの交換をサポートするシェル(ksh、zsh、bash)を使用すると、次のことができます。

xargs -r0a <(locate -0 php.ini) vi

-a filenameアイデアはstdinの代わりにファイルのリストを渡すことです。使用すると、-0ファイル名に含まれる文字または非文字に関係なく正しく機能します。

これにより、zsh次のことができます。

vi ${(0)"$(locate -0 php.ini)"}

0NULで分割されたパラメータ拡張フラグはどこにありますか?)

ただし、ファイルが見つからない場合でもxargs -r引数なしで実行できることに注意してください。vi

答え4

同じエディタで複数のphp.iniを編集しますか?

努力する: vim -o $(locate php.ini)

関連情報