このxargs
命令はいつも私を混乱させます。一般的なルールがありますか?
次の 2 つの例を考えてみましょう。
$ \ls | grep Cases | less
「Cases」に一致するファイルを印刷しますが、コマンドを次に変更するには、次のものがtouch
必要ですxargs
。
$ \ls | grep Cases | touch
touch: missing file operand
Try `touch --help' for more information.
$ \ls | grep Cases | xargs touch
ベストアンサー1
違いは、ターゲットプログラムが許可するデータにあります。
パイプのみを使用すると、標準入力ストリーム(STDIN)のデータを生データの束として受け取り、一度に1行ずつ並べ替えることができます。ただし、一部のプログラムは標準入力のコマンドを受け入れず、そのコマンドの引数にそのコマンドが指定されることを期待しています。たとえば、touch
次のようにコマンドラインからファイル名を引数として渡しますtouch file1.txt
。
ファイル名を出力するプログラムがある場合標準出力そしてそれらを使いたいパラメータとしてこれを行うには、それをtouch
使用xargs
してSTDINストリームデータを読み取り、各行をコマンドの空白で区切られた引数に変換する必要があります。
これら2つは同じです。
# touch file1.txt
# echo file1.txt | xargs touch
xargs
その機能が何であるか、なぜ必要なのかを正確に知らない限り、使用しないでください。多くのxargs
場合、キャストを使用するよりも操作を実行するより良い方法があります。変換プロセスには、エスケープや単語拡張などの潜在的なトラップもあります。