Bash

如何獲取子shell的pid?

  • October 26, 2021

如何獲取子shell的pid?

例如:

$ echo $$
16808

這不起作用,因為原始外殼擴展$$

$ ( echo $$ )
16808

為什麼單引號不起作用?原shell去掉單引號後,子shell本身不展開$$了嗎?

$ ( echo '$$' )
$$

為什麼也eval不起作用?是eval由子shell執行的嗎?為什麼它給了我原始 shell 的 PID?

$ ( eval echo '$$' )
16808

謝謝。

除了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(例如zshksh93)不會為使用(...);創建的每個子 shell 啟動子程序。在這種情況下,$pid可能最終與 相同$$,這是正確的,因為這getpid是呼叫程序的 PID。

$ echo $BASHPID
37152
$ ( echo $BASHPID )
18633

從手冊:

BASHPID

擴展為目前 bash 程序的程序 ID。這與$$某些情況下不同,例如不需要重新初始化 bash 的子 shell。

$

擴展為 shell 的程序 ID。在()子shell 中,它擴展為目前shell 的程序ID,而不是子shell。

有關的:

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