如何获取管道中第一个命令的退出状态? [复制]

Posted

技术标签:

【中文标题】如何获取管道中第一个命令的退出状态? [复制]【英文标题】:how to get the exit status of the first command in a pipe? [duplicate] 【发布时间】:2014-09-04 06:29:03 【问题描述】:

我做了一个简单的脚本:

$ more test.bash
#!/bin/bash
echo test
exit 1

当我运行脚本时,退出状态应该是 1

$ /tmp/test.bash
echo $?
1

但是当我按以下方式运行时

/tmp/test.bash | tr -d '\r' 1>>$LOG 2>>$LOG
echo $?
0

退出状态为0,(不是预期的1

似乎退出状态来自 tr 命令。 但我想要的是从脚本中获取退出状态 - test.bash。

我需要在我的语法中添加/更改什么以便从脚本而不是从管道之后的命令中获得正确的退出状态?

【问题讨论】:

【参考方案1】:

使用PIPESTATUS 数组:

$ ls foo | cat
ls: foo: No such file or directory
$ echo $PIPESTATUS[0] $PIPESTATUS[1]
2 0

注意:PIPESTATUS 是一个 bashism(即不是 POSIX)。

【讨论】:

对我来说非常非常好和新! (为你 +1) 很高兴帮助一个人类同胞:-) 投票选出最佳答案 替代方案:您可以通过set -o pipefail进行初始化来检查所有命令是否以0退出

以上是关于如何获取管道中第一个命令的退出状态? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从最后一个管道(stdin)获取退出代码

在命令行上完成机器人测试后如何获取退出代码或退出状态

Bash pipe:获取管道中前一个进程的退出状态

跨管道传播退出状态

如何将数据写入 Python shell 管道中第一个进程的标准输入?

Bash:如何在使用微调器时获取命令的退出代码?