如何等待用于 I/O 重定向的子进程?

如何等待用于 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

答案1

虽然该后台作业的bash设置$!以 开始exec 3> >(job),但您不能等待它或执行您可以执行的任何其他操作job &(例如fgbg或通过作业编号引用它)。ksh93bash从哪里得到这个功能)或者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

相关内容