我正在尝试使用协进程将异步进程的输出通过管道传输到其他 shell 命令中,然后检查异步进程的退出状态:
coproc LS { ls dir; }
while IFS= read i; do echo "$i"; done <&"$LS" # Do something with the output.
wait "$LS_PID"; echo $? # Check exit status.
问题是上面的代码不起作用,至少不能与 Bash 一起工作4.3.46(1)-release
。while
执行该语句后,Bash 将取消设置$LS_PID
(可能是因为它注意到进程已终止)。调用wait
进程仍然有效,例如:
coproc LS { ls dir; }
P=$LS_PID
while IFS= read i; do echo "$i"; done <&"$LS" # Do something with the output.
wait "$P"; echo $? # Check exit status.
这将打印0
或2
取决于目录是否存在。因此,我必须将 PID 保存到另一个变量中,这只是一个不便。但我感兴趣的是为什么会发生这种情况以及我是否可以影响这种情况。
为什么$LS_PID
在我wait
上进程之前未设置?这种行为是否记录在某处?是否有一个简单的解决方法,因为我认为使用命令的输出并检查其退出代码是一个常见的用例。
答案1
这是该变量的预期行为COPROC_PID
,尽管 Bash 手册中没有记录。
正确的解决方法是完全按照你已经做过的事情去做;将 的值保存$COPROC_PID
在一个变量中,当协进程退出时该变量不会被取消设置。
请注意,这将不是如果协同进程在您有时间获取其 PID 之前退出,则它会起作用,因此在使用变量之前确保变量具有值可能是明智的。