2019-02-16

シェルスクリプト内部でのバックグラウンド起動

シェルスクリプトを作成していて、奇妙な動作に気付きました。以下に示すのが状況を再現するシェルスクリプトです。
     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: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をバックグラウンド起動しようとしています。処理された時間を確認すると、「1>>>」と「2>>>」の間は一瞬なのに、「2>>>」と「3>>>」の間は5秒間あります。つまり「sleep 5」の完了を待っているのでしょう。

こういうものなのでしょうか? パイプで繋いだコマンド群の内部でバックグランド起動が発生するというのが、そもそも見当外れなのかもしれません。

僕が期待していた動作は、myfuncの中でmysleepを「バックグランド」で呼び出したので、myfuncの実行とは切り離されて動作して欲しかったのです。要するに「非同期処理」を期待したのですが、mysleepの完了を待っているので、「同期処理」になってしまっています。

ここで使われている/bin/shは「GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)」ですが、他のシェルや、他のバージョンなら違う結果になるでしょうか。それとも、何かの仕様書で、このような動作は決められているのでしょうか。

0 件のコメント:

コメントを投稿