1 #!/bin/shこれを実行すると、次のような結果を得ます。
2 export LANG=C
3
4 mysleep () {
5 sleep 5
6 }
7
8 myfunc () {
9 echo "myfunc:$(date)"
10 mysleep &
11 echo "myfunc:$(date)"
12 }
13
14 echo "1>>> $(date)"
15 myfunc
16
17 echo "2>>> $(date)"
18 myfunc | tee
19
20 echo "3>>> $(date)"
21 #[EOF]
1>>> Sat Feb 16 18:05:40 JST 2019定義した関数myfuncの内部でmysleepをバックグラウンド起動しようとしています。処理された時間を確認すると、「1>>>」と「2>>>」の間は一瞬なのに、「2>>>」と「3>>>」の間は5秒間あります。つまり「sleep 5」の完了を待っているのでしょう。
myfunc:Sat Feb 16 18:05:40 JST 2019
myfunc:Sat Feb 16 18:05:40 JST 2019
2>>> Sat Feb 16 18:05:40 JST 2019
myfunc:Sat Feb 16 18:05:40 JST 2019
myfunc:Sat Feb 16 18:05:40 JST 2019
3>>> Sat Feb 16 18:05:45 JST 2019
こういうものなのでしょうか? パイプで繋いだコマンド群の内部でバックグランド起動が発生するというのが、そもそも見当外れなのかもしれません。
僕が期待していた動作は、myfuncの中でmysleepを「バックグランド」で呼び出したので、myfuncの実行とは切り離されて動作して欲しかったのです。要するに「非同期処理」を期待したのですが、mysleepの完了を待っているので、「同期処理」になってしまっています。
ここで使われている/bin/shは「GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)」ですが、他のシェルや、他のバージョンなら違う結果になるでしょうか。それとも、何かの仕様書で、このような動作は決められているのでしょうか。
0 件のコメント:
コメントを投稿