Bash
為什麼“$$”在 bash 管道中沒有變化?他們不啟動子流程嗎?
我執行了以下程式碼:
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。