2

Xargs を使用して、標準入力の内容を扱いやすい断片に分割し、その断片ごとにコマンドを呼び出すことができます。しかし、それがどの作品かを知ることはできますか?例を挙げると:

シーケンス 1 10 | xargs -P 2 -n 2 mycommand

電話します

mycommand 1 2 &
mycommand 3 4 &
mycommand 5 6 &
mycommand 7 8 &
mycommand 9 10 &

しかし、「mycommand」スクリプトで知りたいのは

mycommand 1 2

最初のピース/セグメントを処理しています。その情報にアクセスすることは可能ですか?

ps 上記の単純な例では、数字を見て判断できます。しかし、任意のリストの場合、入力ストリームに実際に piece# を挿入せずに、どのように情報にアクセスするのでしょうか?

4

1 に答える 1

0

入力を変更してシーケンス番号を追加した場合にのみ、これを行うことができます。

seq 1 10 | perl -ne '$. % 2 and print (($.+1)/2,"\n"); print' | xargs -n3 ...

なぜこれが必要なのかは不明ですが、最終的な目標が出力を入力と同じ順序に保つことである場合は、GNU Parallel を使用する方が簡単かもしれません。

seq 1 10 | parallel -j+0 -n2 -k mycommand 

詳細については、GNU Parallel の紹介ビデオをご覧ください: http://www.youtube.com/watch?v=OpaiGYxkSuQ

バージョン 20101113 以降、GNU Parallel には、コマンドのシーケンス番号に設定された $PARALLEL_SEQ があります。

seq 1 10 | parallel -j+0 -n2 -k mycommand \$PARALLEL_SEQ

これはまさにあなたが探しているものかもしれません。

于 2010-10-24T22:16:12.980 に答える