web-dev-qa-db-ja.com

サブシェルのPIDを取得するにはどうすればよいですか?

サブシェルのPIDを取得するにはどうすればよいですか?

例えば:

$ echo $$
16808

元のシェルは$$を展開するため、これは機能しません。

$ ( echo $$ )
16808

単一引用符が機能しないのはなぜですか?元のシェルが単一引用符を削除した後、サブシェル自体が$$を展開しませんか?

$ ( echo '$$' )
$$

なぜevalも機能しないのですか? evalはサブシェルによって実行されますか?なぜ元のシェルのPIDが表示されるのですか?

$ ( eval echo '$$' )
16808

ありがとう。

12
Tim

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であるため、ちょうどいいです。

12
mosvy
$ echo $BASHPID
37152
$ ( echo $BASHPID )
18633

マニュアルから:

BASHPID

現在のbashプロセスのプロセスIDに展開されます。これは、bashを再初期化する必要のないサブシェルなど、特定の状況下では$$とは異なります。

$

シェルのプロセスIDに展開されます。 ()サブシェルでは、サブシェルではなく、現在のシェルのプロセスIDに展開されます。

関連:

18
Kusalananda