目から鱗だったので。
POSIX主義者としてはちょっとアレではあるのだが、それでもあまりにも便利だったのでメモらずにはいられない。
xargs -P
は神。
-P
拡張されているxargsためしてみた。これは、ちょっと試すためなので、bashを使った。 bashの数値計算拡張が一番簡単だったので。
echo 2 3 4 1 2 3 4 1 2 3 4 1 | xargs -n 1 -P 3 -I % sh -c 'sleep $((%)); echo "%" ' 2 3 1 4 2 3 1 4 2 3 1 4
何をしているのか?というと、
-n 1
) し、実行させたいコマンドの %
の部分に投入(-I %
)し、3プロセスずつ実行(-P 3
)させる。$((%))
)し、sleepの引数に渡し、sleepが終了したら渡された引数を出力するという作業。
あとはパズルなので、ちゃんと考えればわかると思うが一応
2 3 4 1 2 3 4 1 2 3 4 1
の順になる。2 3 1 4 2 3 1 4 2 3 1 4
の順になる。
これは、xargsが「プロセスの終了を待って」、「プロセスごとにどんどん-P
の引数分だけ」処理を開始させることを意味している。
つまり、疑似マルチタスクを実行することができるということになる。
POSIXにもこの引数を取り入れてほしい…