
ループを使用して複数のコマンドを並列に実行したいと思いますfor
。各コマンドには少し時間がかかることがあり、スクリプトの最後に別のコマンドを呼び出したいと思います。以下は最小限の例です。
#!/bin/bash
function test {
length=$1
sleep $length
echo "$length"
echo "-----"
}
# http://www.cyberciti.biz/faq/bash-for-loop-array/
array=( 5 1 3 )
for time in "${array[@]}"
do
test $time &
done
結果は次のとおりです。
$ bash ~/test.sh && echo "OK"
OK
$ 1
-----
3
-----
5
-----
ご覧のとおり、スクリプトOK
が終了する前に表示されます。これはtest
バックグラウンドで呼び出されるので論理的です。最後の呼び出しは他の呼び出しの前に終了する可能性があるため、テストを追加すること&
はできません。バックグラウンド呼び出しのすべてのインスタンスが終了した後にのみtest
スクリプトを終了したいと思います。test
これが私が得ようとしている結果です。
$ bash ~/test.sh && echo "OK"
1
-----
3
-----
5
-----
OK
$
この出力をどのように取得できますか?
答え1
あなたはする必要があります待つループを実行した後、for
現在アクティブなすべての子プロセスを待ちます。
for time in "${array[@]}"
do
test "$time" &
done
wait