Bash

將“$!”用“&”可靠地返回正確的 ID?

  • December 13, 2020

在我的測試中,到目前為止,我總是得到正確的結果:

[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 都終止並以零退出狀態退出。

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