Shell

如何在 Korn Shell 中獲取 subshel l 的 PID(相當於 $BASHPID)

  • February 14, 2018

在 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')

引用自:https://unix.stackexchange.com/questions/32576