Bash
如何獲取子shell的pid?
如何獲取子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(例如
zsh
或ksh93
)不會為使用(...)
;創建的每個子 shell 啟動子程序。在這種情況下,$pid
可能最終與 相同$$
,這是正確的,因為這getpid
是呼叫程序的 PID。
$ echo $BASHPID 37152 $ ( echo $BASHPID ) 18633
從手冊:
BASHPID
擴展為目前 bash 程序的程序 ID。這與
$$
某些情況下不同,例如不需要重新初始化 bash 的子 shell。
$
擴展為 shell 的程序 ID。在
()
子shell 中,它擴展為目前shell 的程序ID,而不是子shell。有關的:
- 括號真的將命令放在子shell中嗎?,尤其是Gilles 回答的部分內容。