【发布时间】:2012-02-25 13:17:01
【问题描述】:
我知道在 bash 中我们可以使用圆括号 ( 和 ) 创建子shell。根据 bash 手册页:
(list) list is executed in a subshell environment
还要获取我们使用的当前进程ID:
echo $$
现在我的问题是如何获取在命令行上使用( 和) 创建的子shell 的进程ID?
如果我使用这个:
echo $$; ( echo $$; )
我将在标准输出上打印两次父 shell 的进程 ID,因为 $$ 甚至在创建子 shell 之前就已扩展。那么如何真正强制惰性扩展呢?
[解决方案不仅适用于 Linux,还应该适用于 Mac]
更新:
建议的链接答案不起作用,因为 echo $BASHPID 不起作用在我的 Mac 上并返回空白。
【问题讨论】:
-
我相信 BASHPID 需要 Bash 4,而 OS X 附带 Bash 3.2
-
@anubhava:没错,但我们(SO 社区)直到你编辑才知道这一点;-)
-
是的,但在另一个问题中没有迹象表明那里提供的解决方案不适用于 Mac。这是使这不是重复的关键点。
-
有趣的是,$$ 在子shell 中不起作用的原因与您在问题中所指出的不完全一样。如果问题只是在执行 subshell 代码之前 $$ 正在扩展,您可以通过执行 (eval echo '$$') 轻松解决此问题,但实际上,这也不起作用。根据tldp.org/LDP/abs/html/internalvariables.html 的最后一个脚注,$$ 只返回顶层的pid,句点。但是,它没有说明原因。我不知道这个问题的答案。
-
请注意,如果您只想获得一个简单且可用的子进程 PID(不是括号内的一个):serverfault.com/questions/205498/…
标签: macos bash shell unix process