xargs
シェルスクリプトで広く使用されています。通常、これらの使用法を bash using while read -r; do ... done
or while read -ar; do ... done
loops で簡単に作り直すことができます。
while-read ループをxargs
優先するのはいつですか?
while
ループの問題は、一度に 1 つのアイテムを処理する傾向があることです。多くの場合、それは不要です。これはxargs
利点があります。引数をまとめて、1 つのコマンドで多くのアイテムを処理できるようにすることができます。
たとえば、while ループ:
pax> echo '1
2
3
4
5' | while read -r; do echo $REPLY; done
1
2
3
4
5
および対応するxargs
:
pax> echo '1
2
3
4
5' | xargs echo
1 2 3 4 5
ここでは、行が で 1 つずつ処理され、while
で全体が処理されていることがわかりますxargs
。つまり、前者は に相当しecho 1 ; echo 2 ; echo 3 ; echo 4 ; echo 5
、後者はecho 1 2 3 4 5
(1 つではなく 5 つのプロセス)に相当します。プロセスの作成には時間がかかるため、数千行または数万行を処理する場合、これは本当に違いを生みます。
複数の引数を受け入れることができるコマンドを使用する場合、開始される個々のプロセスの数が減り、処理がはるかに高速になるため、主に有利です。
小さなファイルを処理している場合や、各アイテムで実行するコマンドが複雑な場合 (私は怠惰すぎて に与える別のスクリプトを書くことができませんxargs
)、while
バリアントを使用します。
パフォーマンス (大きなファイル) に関心があるxargs
場合は、別のスクリプトを作成する必要がある場合でも、を使用します。
の実装の中には、複数のジョブを並行して実行できる引数xargs
も理解するものがあります。これをループでシミュレートするのは非常に困難です。-P MAX-PROCS
xargs
while read
GNU Parallel http://www.gnu.org/software/parallel/には、xargs
(-m を使用する) ことによる利点と、while-read
区切り記号としての改行といくつかの新機能 (出力のグループ化、リモート コンピューターでのジョブの並列実行など) の利点があります。 、およびコンテキスト置換)。
GNU Parallel がインストールされている場合、xargs
. そして、私が使用する唯一の状況は、read-while
実行するブロックが非常に大きく、1 行に入れることができない場合 (たとえば、if ステートメントなどを含む場合) であり、bash 関数の作成を拒否する場合です。
すべての小さなスクリプトについては、実際には GNU Parallel を使用する方が読みやすいと思います。paxdiablo の例:
echo '1
2
3
4
5' | parallel -m echo
GNU Parallel を使用した WAV ファイルの MP3 への変換:
find sounddir -type f -name '*.wav' | parallel -j+0 lame {} -o {.}.mp3
GNU Parallel の紹介ビデオをご覧ください: http://www.youtube.com/watch?v=OpaiGYxkSuQ
「xargs」にはオプション「-n max-args」があり、これにより、複数の引数のコマンドを一度に呼び出すことができると思います(「grep」、「rm」、およびその他多くのそのようなプログラムに役立ちます)マンページの例を試してください:
cut -d: -f1 < /etc/passwd | sort | xargs -n 5 echo
そして、1行あたり5人のユーザーを「エコー」したことがわかります
PSそして、「xargs」がプログラムであることを忘れないでください(サブシェルのような)。したがって、簡単な方法でシェルスクリプトに情報を取得する方法はありません (「xargs」の出力を読み取り、何らかの方法で解釈して、シェル/環境変数を埋める必要があります)。