2013年12月8日日曜日

bash の wait コマンド(shell builtin command)

今日まで存在を知らなかった。。。バックグラウンドプロセスが終了するまで待ち合わせするコマンド。

惰性で順次実行してたシェルスクリプトを手軽に並行実行できるようになって効率上がるかも。

環境
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
Copyright (C) 2007 Free Software Foundation, Inc.
$ help wait
wait: wait [n]
    Wait for the specified process and report its termination status.  If
    N is not given, all currently active child processes are waited for,
    and the return code is zero.  N may be a process ID or a job
    specification; if a job spec is given, all processes in the job's
    pipeline are waited for.
例1) wait なし
$ cat test.sh 
#!/bin/bash
date
(sleep 1; echo 'sleep 1') &
(sleep 2; echo 'sleep 2') &
(sleep 3; echo 'sleep 3') &
date

$ ./test.sh 
2013年 12月 8日 日曜日 23時03分12秒 JST
2013年 12月 8日 日曜日 23時03分12秒 JST
sleep 1
sleep 2
sleep 3
バックグラウンドプロセスの終了を待たずに2つ目の date コマンドが実行されて日時を出力。その後1、2、3秒ごとに echo の結果が。
例2) wait あり
$ cat test.sh 
#!/bin/bash
date
(sleep 1; echo 'sleep 1') &
(sleep 2; echo 'sleep 2') &
(sleep 3; echo 'sleep 3') &
wait
date
$ ./test.sh 
2013年 12月 8日 日曜日 23時06分58秒 JST
sleep 1
sleep 2
sleep 3
2013年 12月 8日 日曜日 23時07分01秒 JST
全バックグラウンドプロセスの実行&終了を待ってから2つ目の date コマンドが実行された。合計3秒待ったから3秒後の日時がプリントされた。