为什么 "$$" 在 bash 管道中没有改变?他们不启动子流程吗?

Phi*_*ppe 17 shell bash process

我运行以下代码:

echo $$
# Output : 3911
true | while true; do
    eval 'echo $$'
    break
done
# Output : 3911
Run Code Online (Sandbox Code Playgroud)

文档说 while 循环(涉及管道)在子进程中运行,在这种情况下,两个进程 ID 是否应该不同?

Kus*_*nda 22

$$bash,如果你在一个子shell检查将保持不变,甚至。这种行为是POSIX 标准规定的:

$

扩展为调用的 shell 的十进制进程 ID。在子shell [...] 中,$应扩展到与当前shell 相同的值。

您可能应该$BASHPID改用。以下内容来自bash手册:

BASHPID

扩展到当前 bash 进程的进程 ID。 这与$$某些情况下不同,例如不需要重新初始化 bash 的子 shell。 赋值 BASHPID没有效果。如果BASHPID未设置,它将失去其特殊属性,即使随后被重置。

重写您的代码以使用$BASHPID

printf '%s\n' "$BASHPID"
true | while true; do
    printf '%s\n' "$BASHPID"
    break
done
Run Code Online (Sandbox Code Playgroud)

运行它会输出两个不同的 PID。