次のコードを実行しました。
echo $$
# Output : 3911
true | while true; do
eval 'echo $$'
break
done
# Output : 3911
ドキュメントによると、whileループ(パイプを含む)は子プロセスで実行されます。この場合、2つのプロセスIDが異なる必要がありますか?
答え1
サブシェルでin値を確認しても、$$
その値は変更されません。bash
この動作は、次のために発生します。POSIX規格:
$
呼び出しシェルの10進プロセスIDに展開されます。サブシェルでは、[...]は
$
現在のシェルと同じ値に拡張する必要があります。
おそらく使用する必要があります$BASHPID
。以下はbash
マニュアルから抜粋した内容です。
BASHPID
現在のbashプロセスのプロセスIDに展開されます。 これは
$$
、bashを再初期化する必要がないサブシェルと同じ場合とは異なります。 割り当てにはBASHPID
何の影響もありません。設定しないと、BASHPID
後でリセットしても特殊属性が失われます。
代わりに使用するコードを書き直してください$BASHPID
。
printf '%s\n' "$BASHPID"
true | while true; do
printf '%s\n' "$BASHPID"
break
done
このコマンドを実行すると、2つの異なるPIDが出力されます。