考虑以下 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
答案1
虽然该后台作业的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
。