Bash

如何等待用於 I/O 重定向的子程序?

  • February 21, 2013

考慮以下 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 &(例如fgbg或通過作業編號引用它)。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

也可以工作,但不能在ksh93or中bash

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