Tim Asked: 2018-11-28 05:23:44 +0800 CST2018-11-28 05:23:44 +0800 CST 2018-11-28 05:23:44 +0800 CST 如何获取子shell的pid? 772 如何获取子shell的pid? 例如: $ echo $$ 16808 这不起作用,因为原始外壳扩展$$: $ ( echo $$ ) 16808 为什么单引号不起作用?原shell去掉单引号后,子shell本身不展开$$了吗? $ ( echo '$$' ) $$ 为什么也eval不起作用?是eval由子shell运行的吗?为什么它给了我原始 shell 的 PID? $ ( eval echo '$$' ) 16808 谢谢。 bash process 3 个回答 Voted Kusalananda 2018-11-28T05:34:42+08:002018-11-28T05:34:42+08:00 $ echo $BASHPID 37152 $ ( echo $BASHPID ) 18633 从手册: BASHPID 扩展为当前 bash 进程的进程 ID。这与$$某些情况下不同,例如不需要重新初始化 bash 的子 shell。 $ 扩展为 shell 的进程 ID。在()子shell 中,它扩展为当前shell 的进程ID,而不是子shell。 有关的: 括号真的将命令放在子shell中吗?,尤其是Gilles 回答的部分内容。 Best Answer mosvy 2018-11-28T07:00:02+08:002018-11-28T07:00:02+08:00 除了bash's之外$BASHPID,您还可以通过以下方式进行便携式操作: pid=$(exec sh -c 'echo "$PPID"') 例子: (pid=$(exec sh -c 'echo "$PPID"'); echo "$$ $pid") 你可以把它变成一个函数: # usage getpid [varname] getpid(){ pid=$(exec sh -c 'echo "$PPID"') test "$1" && eval "$1=\$pid" } 请注意,某些 shell(例如zsh或ksh93)不会为使用(...);创建的每个子 shell 启动子进程。在这种情况下,$pid可能最终与 相同$$,这是正确的,因为这getpid是调用进程的 PID。 spawn 2021-10-26T16:44:26+08:002021-10-26T16:44:26+08:00 在 Linux 上,不会产生新进程的跨 shell 解决方案(至少是 dash、bash、zsh)是 read -r this_pid < /proc/self/stat; echo ${this_pid%% *} 至少在 bash 和 zsh 中,我们还可以使用空格作为读取分隔符: read -d ' ' this_pid < /proc/self/stat ; echo $this_pid 另见man 5 proc 部分 /proc/[pid]/stat
从手册:
有关的:
除了
bash
's之外$BASHPID
,您还可以通过以下方式进行便携式操作:例子:
你可以把它变成一个函数:
请注意,某些 shell(例如
zsh
或ksh93
)不会为使用(...)
;创建的每个子 shell 启动子进程。在这种情况下,$pid
可能最终与 相同$$
,这是正确的,因为这getpid
是调用进程的 PID。在 Linux 上,不会产生新进程的跨 shell 解决方案(至少是 dash、bash、zsh)是
至少在 bash 和 zsh 中,我们还可以使用空格作为读取分隔符:
另见man 5 proc 部分 /proc/[pid]/stat