为何子Shell中的$$与父Shell中的$$值相同?
为什么Bash子shell里的$$和主进程输出相同?
嗨,这个问题其实涉及到Bash中$$变量的特殊行为,我来给你拆解清楚~
首先先把你的脚本贴出来方便参考:
#! /bin/bash func1() { echo $$ } echo $$ ( func1 )
你预期( func1 )启动的子shell里输出的PID和主进程不同,但实际两者都是9644,核心原因是**$$在Bash中的定义和你想的不一样**。
关键知识点:$$的本质
按照POSIX标准的规定,$$变量返回的是当前脚本的原始启动进程ID,而不是当前正在执行代码的进程ID。也就是说,哪怕你在子shell里,$$依然会继承父进程的PID值,而不是显示子shell自己的真实PID。这个设计是为了让脚本里的临时文件、日志命名等操作能统一使用同一个标识,避免不同子shell生成不同的文件名导致混乱。
如何获取子shell的真实PID?
如果你想拿到子shell自己的真实进程ID,Bash提供了一个专属变量$BASHPID,它会返回当前执行上下文的真实PID。我们修改你的脚本试试:
#! /bin/bash func1() { echo "子shell真实PID: $BASHPID" echo "$$的值: $$" } echo "主进程PID: $$" ( func1 )
执行这个修改后的脚本,你会看到类似这样的输出:
主进程PID: 9644 子shell真实PID: 9645 $$的值: 9644
这就能看到子shell的真实PID和主进程不同,而$$依然保持主进程的PID。
额外补充
如果你是通过bash -c 'echo $$; echo $BASHPID'这种方式启动一个全新的Bash进程,那$$会返回这个新进程的PID,因为这是一个独立的脚本实例,而不是原有脚本的子shell。但在同一个脚本内部的子shell(比如用()包裹的代码块),$$就会始终指向主脚本的PID。
内容的提问来源于stack exchange,提问作者yi.chen
相关产品推荐
相关产品推荐

