Shell
如何在 Korn Shell 中獲取 subshel l 的 PID(相當於 $BASHPID)
在 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 $!"
這將輸出以下內容:
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
我想要的是以
****
輸出子shell的PID開頭的行,在範例中為5329。
我認為這在 ksh 中不可用。有一個涉及執行外部程序的 POSIX 解決方案:
sh -c 'echo $PPID'
在 Linux 上,
readlink /proc/self
也可以工作,但我看不到任何優勢(它可能會稍微快一點;它可能對有readlink
但沒有的 BusyBox 變體有用$PPID
,但我認為沒有)。請注意,為了獲取 shell 中的值,您需要注意不要在短暫的子子 shell 中執行該命令。例如,
p=$(sh -c 'echo $PPID')
可能會顯示在命令替換中呼叫的子 shell 的輸出sh
(或者可能不會,某些 shell 會優化這種情況)。相反,執行p=$(exec sh -c 'echo $PPID')