目から鱗だったので。
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にもこの引数を取り入れてほしい…