
$(sleep 5) &
echo $!
sleep 1
echo "done"
上記の出力は次のとおりです。
$ ./test.sh
7483
done
しかし、検索してみるとsleep
次のようps aux
になります。
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
sleep 5プロセスは7485
スクリプトの出力ではありません7483
。この行動の理由は何ですか?
答え1
$(sleep 5)
実行中のシェルを実行しますsleep
。与えられたpidは$!
シェルのpidです。
ここではあえて変える必要はありません。
sleep 5 &
sleep
あなたにpidを与えるでしょう。
sleep
あなたの例では他のものが置き換えられたと思いますが、それでも背景の交換はおそらく不要です。サブシェルのみを使用してください。
(sleep 5) &
sleep
pidは通常、サブシェルで最後のコマンドを実行したときに多くのシェルがサブコマンドに置き換えられるために提供されます。これはサブシェルのpidを効果的に再利用しますsleep
。
(sleep 5; sleep 5) &
代わりにシェルのpidを教えてくれますsleep
。