Philippe Asked: 2020-01-10 11:10:45 +0800 CST2020-01-10 11:10:45 +0800 CST 2020-01-10 11:10:45 +0800 CST 为什么“$$”在 bash 管道中没有变化?他们不启动子流程吗? 772 我运行了以下代码: echo $$ # Output : 3911 true | while true; do eval 'echo $$' break done # Output : 3911 文档说while循环(涉及管道)在子进程中运行,在这种情况下,两个进程ID应该不同吗? bash shell 1 个回答 Voted Best Answer Kusalananda 2020-01-10T11:32:16+08:002020-01-10T11:32:16+08:00 即使您在子外壳中检查它, in 的值也将保持$$不变。bash这种行为是POSIX 标准规定的: $ 展开为被调用 shell 的十进制进程 ID。在子外壳 [...] 中,$应扩展为与当前外壳相同的值。 您可能应该$BASHPID改用。以下内容来自bash手册: BASHPID 扩展为当前 bash 进程的进程 ID。 这与$$某些情况下不同,例如不需要重新初始化 bash 的子 shell。 分配 BASHPID没有影响。如果BASHPID未设置,它将失去其特殊属性,即使它随后被重置。 重写您的代码以$BASHPID改用: printf '%s\n' "$BASHPID" true | while true; do printf '%s\n' "$BASHPID" break done 运行此程序将输出两个不同的 PID。
即使您在子外壳中检查它, in 的值也将保持
$$
不变。bash
这种行为是POSIX 标准规定的:您可能应该
$BASHPID
改用。以下内容来自bash
手册:重写您的代码以
$BASHPID
改用:运行此程序将输出两个不同的 PID。