なぜ$!バックグラウンドで実行されているサブシェルの無効なプロセスIDを返しますか?

なぜ$!バックグラウンドで実行されているサブシェルの無効なプロセスIDを返しますか?
$(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) &

sleeppidは通常、サブシェルで最後のコマンドを実行したときに多くのシェルがサブコマンドに置き換えられるために提供されます。これはサブシェルのpidを効果的に再利用しますsleep

(sleep 5; sleep 5) &

代わりにシェルのpidを教えてくれますsleep

おすすめ記事