Tim*_*Tim 17 bash process subshell
如何获取子shell的pid?
例如:
$ echo $$
16808
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为原始外壳扩展$$:
$ ( echo $$ )
16808
Run Code Online (Sandbox Code Playgroud)
为什么单引号不起作用?原shell去掉单引号后,子shell$$自己不展开了吗?
$ ( echo '$$' )
$$
Run Code Online (Sandbox Code Playgroud)
为什么也eval不起作用?是eval由子shell 运行的吗?为什么它会给我原始外壳的 PID?
$ ( eval echo '$$' )
16808
Run Code Online (Sandbox Code Playgroud)
谢谢。
Kus*_*nda 20
$ echo $BASHPID
37152
$ ( echo $BASHPID )
18633
Run Code Online (Sandbox Code Playgroud)
从手册:
BASHPID扩展到当前 bash 进程的进程 ID。这与
$$某些情况下不同,例如不需要重新初始化 bash 的子 shell。
$扩展到 shell 的进程 ID。在
()子shell中,它扩展到当前shell的进程ID,而不是子shell。
有关的:
mos*_*svy 13
除了bash's $BASHPID,您还可以通过以下方式轻松实现:
pid=$(exec sh -c 'echo "$PPID"')
Run Code Online (Sandbox Code Playgroud)
例子:
(pid=$(exec sh -c 'echo "$PPID"'); echo "$$ $pid")
Run Code Online (Sandbox Code Playgroud)
你可以把它变成一个函数:
# usage getpid [varname]
getpid(){
pid=$(exec sh -c 'echo "$PPID"')
test "$1" && eval "$1=\$pid"
}
Run Code Online (Sandbox Code Playgroud)
请注意,某些外壳程序(例如zsh或ksh93)不会为每个使用(...);创建的子外壳程序启动子进程。在这种情况下,$pid可能最终与 相同$$,这是正确的,因为这getpid是调用进程的 PID 。