子プロセス自体から子プロセスのpidを取得する方法

子プロセス自体から子プロセスのpidを取得する方法

子プロセス自体から子プロセスのpidをどのように取得できますか?

  foo()
{
 echo pid=$$
 echo spid=$!
 echo bpid=$BASHPID
}

echo PARENT_PID=$$
foo &
wait

初めて実行すると、次のような結果が得られます。

PARENT_PID=17112
[1]     17512
pid=17112
spid=
bpid=

私はspid 17512を見ると予想しました。

2番目に実行すると、奇妙な現象が発生します。

PARENT_PID=17112
[1]     17797
pid=17112
spid=17512 #why I see here pid of previous subprocess???
bpid=

17797を見ると予想しましたが、17512が出ました!

したがって、2つの質問があります。 1)どのようにサブプロセスの内部からサブプロセスのpidを取得しますか? (Fooを複数回実行し、各サブプロセスのpidを見ることを期待しています。)
2)2番目の実行で予期しない結果が出るのはなぜですか?

答え1

POSIX 標準定義は$$常に基本シェルの pid です。

プロセスがバックグラウンドで実行されている場合は、$!最後のバックグラウンドプロセスのpidを返します。

関連情報