如何获取作为后台进程运行的管道中命令的返回代码?

如何获取作为后台进程运行的管道中命令的返回代码?

在 Bash 脚本中,如果我在管道中运行命令,则特殊参数$?将包含管道中最后一个命令的返回码。例如,对于故意失败的命令,我获得了该命令rsync的返回码:tee

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2
$ echo $?
0

我可以rsync使用包含最后一个管道的返回代码的特殊数组中的第一个条目来获取命令的返回代码$PIPESTATUS

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2
$ echo ${PIPESTATUS[0]}
23

通常,如果我将一个任务置于后台,我可以使用它wait来收集它的返回代码,因为wait它将镜像它正在等待的后台任务的返回代码。

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 > outfile1 &
$ wait $!
$ echo $?
23

如果后台进程包含管道,我似乎无法结合这两种方法来捕获返回代码?我觉得结合这两种方法不是解决问题的办法,我需要使用不同的方法。

如何执行如下命令并收集第一个命令的返回码?

$ rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2 &

答案1

您可以访问后台进程中的 PIPESTATUS 变量:

$ { rsync /non-existent-dir/ /another-dir2/ 2>&1 | tee outfile1 > outfile2 ; echo $PIPESTATUS } &

如果您只想知道 rsync 命令的退出状态,您可以直接使用exit ${PIPESTATUS[0]}而不是 echo 命令。否则您将不得不使用临时文件。

参考:https://stackoverflow.com/a/50754377/13534737

相关内容