Bash

為什麼“$$”在 bash 管道中沒有變化?他們不啟動子流程嗎?

  • September 12, 2020

我執行了以下程式碼:

echo $$
# Output : 3911
true | while true; do
   eval 'echo $$'
   break
done
# Output : 3911

文件說while循環(涉及管道)在子程序中執行,在這種情況下,兩個程序ID應該不同嗎?

即使您在子外殼中檢查它, in 的值也將保持$$不變。bash這種行為是POSIX 標準規定的:

$

展開為被呼叫 shell 的十進制程序 ID。在子外殼中

$$ … $$,$應擴展為與目前 shell 相同的值。

您可能應該$BASHPID改用。以下內容來自bash手冊:

BASHPID

擴展為目前 bash 程序的程序 ID。 這與$$某些情況下不同,例如不需要重新初始化 bash 的子 shell。 分配 BASHPID沒有影響。如果BASHPID未設置,它將失去其特殊屬性,即使它隨後被重置。

重寫您的程式碼以$BASHPID改用:

printf '%s\n' "$BASHPID"
true | while true; do
   printf '%s\n' "$BASHPID"
   break
done

執行此程序將輸出兩個不同的 PID。

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