如何在Bash 3中获取BASHPID?MacOS默认Bash3.2子shell PID获取方法
MacOS默认Bash 3.2获取子shell PID的问题解答
首先明确结论:MacOS默认的Bash 3.2完全没法用BASHPID获取子shell的PID——因为BASHPID是Bash 4.0才新增的环境变量,3.2版本根本没有这个特性。你贴的那段判断逻辑在3.2里也完全不成立,因为$BASHPID会被解析为空字符串,起不到判断当前是否为子shell的作用。
那有没有间接方法获取子shell的PID呢?有,可以用一些变通技巧:
方法1:子shell主动写入PID到临时文件
适合需要获取前台子shell PID的场景:
# 生成临时文件存储子shell PID temp_file=$(mktemp) # 启动子shell,先写入自身PID再执行业务逻辑 ( echo $$ > "$temp_file" # 这里写子shell要执行的命令,比如: echo "子shell正在运行" ) # 读取并输出子shell PID subshell_pid=$(cat "$temp_file") echo "子shell的PID是:$subshell_pid" # 清理临时文件 rm "$temp_file"
方法2:用$!捕获后台子shell PID
如果子shell是后台运行的任务,可以直接用$!获取它的PID:
# 将子shell放到后台运行,用$!捕获PID ( echo "后台子shell运行中"; sleep 10 ) & subshell_pid=$! echo "后台子shell的PID是:$subshell_pid"
另外补充个知识点:不管是Bash 3.2还是更高版本,$$始终指代启动当前shell会话的原始PID,父shell和子shell的$$值是一样的,所以没法用它区分父子进程。
内容的提问来源于stack exchange,提问作者user5047085
相关产品推荐
相关产品推荐

