【发布时间】:2013-06-27 17:44:25
【问题描述】:
我正在通过高级 Bash 脚本指南学习 bash-shell。这本书说
括号内的命令列表开始一个子shell。
所以,我尝试了这段代码:
echo "in parentshell \$\$=$$"
( echo "in subshell \$\$=$$" )
我认为后者应该打印子进程的pid,但实际上结果与父shell的pid相同。谁能告诉我为什么?
【问题讨论】:
我正在通过高级 Bash 脚本指南学习 bash-shell。这本书说
括号内的命令列表开始一个子shell。
所以,我尝试了这段代码:
echo "in parentshell \$\$=$$"
( echo "in subshell \$\$=$$" )
我认为后者应该打印子进程的pid,但实际上结果与父shell的pid相同。谁能告诉我为什么?
【问题讨论】:
根据Special Parameters section of the reference manual,
$$扩展为 shell 的进程 ID。在()子shell 中,它扩展为调用shell 的进程ID,而不是子shell。
所以你观察到的行为没有什么奇怪的,它有完整的记录。
正如 Ansgar Wiechers 在评论中正确地观察到的那样,
子shell的PID可以通过变量
$BASHPID来确定。
这方面的文档可以在Bash Variables section of the reference manual 中找到。在那里你会读到:
BASHPID扩展为当前 Bash 进程的进程 ID。在某些情况下,这与$$不同,例如不需要重新初始化 Bash 的子 shell。
感谢安斯加!
注意。我不太喜欢你正在阅读的参考资料。
【讨论】:
$BASHPID来确定。