私は次のコードを実行しました:
echo $$
# Output : 3911
true | while true; do
eval 'echo $$'
break
done
# Output : 3911
ドキュメントには、whileループ(パイプに含まれる)がサブプロセスで実行されると記載されています。その場合、2つのプロセスIDは異なる必要がありますか?
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が出力されます。