サブシェルのPIDを取得するにはどうすればよいですか?
例えば:
$ echo $$
16808
元のシェルは$$
を展開するため、これは機能しません。
$ ( echo $$ )
16808
単一引用符が機能しないのはなぜですか?元のシェルが単一引用符を削除した後、サブシェル自体が$$
を展開しませんか?
$ ( echo '$$' )
$$
なぜeval
も機能しないのですか? eval
はサブシェルによって実行されますか?なぜ元のシェルのPIDが表示されるのですか?
$ ( eval echo '$$' )
16808
ありがとう。
bash
の$BASHPID
に加えて、次の方法で移植できます。
pid=$(exec sh -c 'echo "$PPID"')
例:
(pid=$(exec sh -c 'echo "$PPID"'); echo "$$ $pid")
あなたはそれを関数にすることができます:
# usage getpid [varname]
getpid(){
pid=$(exec sh -c 'echo "$PPID"')
test "$1" && eval "$1=\$pid"
}
一部のシェル(たとえば、zsh
またはksh93
)は、(...)
で作成された各サブシェルのサブプロセスを開始しないことに注意してください。その場合、$pid
は$$
と同じになる可能性があります。これは、getpid
が呼び出されたプロセスのPIDであるため、ちょうどいいです。
$ echo $BASHPID
37152
$ ( echo $BASHPID )
18633
マニュアルから:
BASHPID
現在のbashプロセスのプロセスIDに展開されます。これは、bashを再初期化する必要のないサブシェルなど、特定の状況下では
$$
とは異なります。
$
シェルのプロセスIDに展開されます。
()
サブシェルでは、サブシェルではなく、現在のシェルのプロセスIDに展開されます。
関連: