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

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

次のコードを実行しました。

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が出力されます。

おすすめ記事