Bash
如何等待用於 I/O 重定向的子程序?
考慮以下 Bash 腳本片段:
exec 3> >(sleep 1; echo "$BASHPID: here") do-something-interesting exec 3>&- wait $! echo "$BASHPID: there"
執行時,它會產生:
a.sh: line 4: wait: pid 1001 is not a child of this shell 1000: there 1001: here
如何修改該
wait
行以使其實際等待終止1001
?換句話說,我可以更改腳本,使輸出變為:1001: here 1000: there
雖然該後台作業的
bash
設置$!
以 開頭exec 3> >(job)
,但您不能等待它或做任何其他您可以做的事情job &
(例如fg
,bg
或通過作業編號引用它)。ksh93
(從哪裡bash
獲得該功能)或者zsh
甚至不在$!
那裡設置。您可以改為使用標準且可移植的方式:
{ { do-something-interesting } 3>&1 >&4 4>&- | { sleep 1; echo "$BASHPID: here"; } 4>&- } 4>&1 echo "$BASHPID: there"
在
zsh
(並且已明確記錄)zmodload zsh/system { do-something-interesting } 3> >(sleep 1; echo $sysparams[pid]: here) echo $sysparams[pid]: there
也可以工作,但不能在
ksh93
or中bash
。