Bash
將“$!”用“&”可靠地返回正確的 ID?
在我的測試中,到目前為止,我總是得到正確的結果:
[fabian@manjaro ~]$ sleep 10 & echo $! [1] 302657 302657
但是
sleep
並且echo
在這裡同時執行,所以我希望有時會發生在正確設置echo
的值之前執行的情況。$!
這會發生嗎?為什麼對我來說還沒有?我的最終目標:並行執行兩個任務,然後在繼續之前等待兩個任務。目前的計劃是使用類似
foo & bar; wait $!; baz
. 這會一直有效還是有時可以等待任意較舊的後台程序(或者根本沒有,如果$!
為空)?
所以
sleep 10 & echo $!
是兩個命令
sleep 10 & echo $!
他們在同一條線上並不會改變這一點。
所以shell會
fork()
新建一個程序,並將新程序的程序ID放入$!
. 然後新程序將執行sleep
,另一個程序將執行echo
。因此,您可以確定
$!
將始終保存新程序的 PID,即使該程序失敗;這是 的結果fork()
。
為了實現這一點:
我的最終目標:並行執行兩個任務,然後在繼續之前等待兩個任務。
將這兩個命令包含到腳本中就足夠了,將它們發送到後台(
&
),以便立即啟動並並行執行,並且wait
對於它們而言,無需擷取它們的 pid 並顯式等待它們。task1 & task2 & wait echo both tasks finished
從posix手冊
wait
:如果在沒有操作數的情況下呼叫等待實用程序,它將等待直到呼叫 shell 已知的所有程序 ID 都終止並以零退出狀態退出。