web-dev-qa-db-ja.com

「$$」がbashパイプラインで変更されないのはなぜですか?彼らはサブプロセスを開始しませんか?

私は次のコードを実行しました:

echo $$
# Output : 3911
true | while true; do
    eval 'echo $$'
    break
done
# Output : 3911

ドキュメントには、whileループ(パイプに含まれる)がサブプロセスで実行されると記載されています。その場合、2つのプロセスIDは異なる必要がありますか?

16
Philippe

bash$$の値は、サブシェルで調べている場合でも同じままになることがあります。代わりに$BASHPIDを使用する必要があります。

BASHPID

現在のbashプロセスのプロセスIDに展開されます。 これは、bashを再初期化する必要のないサブシェルなど、特定の状況下では$$とは異なります。BASHPIDへの割り当ては無効です。 BASHPIDが設定されていない場合、その後リセットされても、特別なプロパティは失われます。

これを$$の説明と比較してください:

$

シェルのプロセスIDに展開されます。 ()サブシェルでは、サブシェルではなく、呼び出し元のシェルのプロセスIDに展開されます

(両方の抜粋はbashマニュアルからのものです)

代わりに$BASHPIDを使用するようにコードを書き換えます。

printf '%s\n' "$BASHPID"
true | while true; do
    eval 'printf "%s\n" "$BASHPID"'
    break
done

これを実行すると、2つの異なるPIDが出力されます。

21
Kusalananda