Pat*_*aba 8 shell ksh shell-script subshell
在 bash 中,你有这个方便的变量: $BASHPID ,它总是返回当前运行的子 shell 的 PID。如何在 ksh 中获取子 shell 的 PID?例如看下面的代码:
#!/usr/bin/ksh93
echo "PID at start: $$"
function run_in_background {
echo "PID in run_in_background $$"
run_something &
echo "PID of backgrounded run_something: $!"
}
function run_something {
echo "*** PID in run_something: $$"
sleep 10;
}
run_in_background
echo "PID of run in background $!"
Run Code Online (Sandbox Code Playgroud)
这将输出以下内容:
PID at start: 5328
PID in run_in_background 5328
*** PID in run_something: 5328
PID of backgrounded run_something: 5329
PID of run in background 5329
Run Code Online (Sandbox Code Playgroud)
我想要的是以****输出子shell的PID开头的行,在示例的情况下为5329。
Gil*_*il' 11
我不认为这在 ksh 中可用。有一个 POSIX 解决方案,它涉及运行外部进程:
sh -c 'echo $PPID'
Run Code Online (Sandbox Code Playgroud)
在 Linux 上,readlink /proc/self也可以工作,但我看不到任何优势(它可能稍微快一点;它可能对具有readlink但没有的 BusyBox 变体有用$PPID,但我认为没有)。
请注意,为了在 shell 中获取值,您需要注意不要在短期子子 shell 中运行该命令。例如,p=$(sh -c 'echo $PPID')可能会显示在sh命令替换中调用的子 shell 的输出(或者可能不会,某些 shell 优化了这种情况)。相反,运行
p=$(exec sh -c 'echo $PPID')
Run Code Online (Sandbox Code Playgroud)