$(sleep 5) &
echo $!
sleep 1
echo "done"
上記の出力:
$ ./test.sh
7483
done
ただし、ps aux
でsleep
を検索すると、次のようになります。
ps aux | rg sleep
chris 7484 0.0 0.0 132788 1432 pts/6 S+ 12:10 0:00 sleep 1
chris 7485 0.0 0.0 132788 1432 pts/6 S+ 12:10 0:00 sleep 5
chris 7519 0.0 0.0 10376 5744 pts/7 S+ 12:10 0:00 rg --no-ignore-vcs sleep
スリープ5プロセスは7485
であり、スクリプトからの出力として7483
ではありません。この動作の原因は何ですか?
$(sleep 5)
sleep
を実行するシェルを実行します。 $!
によって提供されるPIDはシェルのものです。
ここでの置換は必要ありません。
sleep 5 &
sleep
のpidが表示されます。
あなたの例のsleep
は他のものを置き換えると思いますが、いずれにしても、バックグラウンド置換はおそらく不要です。サブシェルのみを使用して、
(sleep 5) &
多くのシェルは、サブシェルで最後のコマンドを実行すると子コマンドに置き換えられ、sleep
のサブシェルのpidを効果的に再利用するため、通常はsleep
のpidを取得します。だが
(sleep 5; sleep 5) &
sleep
ではなく、シェルのPIDを取得します。