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

10

我写了一个简单的脚本:

$ 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个回答

29

使用PIPESTATUS数组:

$ ls foo | cat
ls: foo: No such file or directory
$ echo ${PIPESTATUS[0]} ${PIPESTATUS[1]}
2 0
注意: PIPESTATUS 是一个 Bash 特有语法(即非 POSIX)。

3
非常棒且对我来说是新的!(+1给你) - maihabunash
6
很高兴能帮助到另一个人 :-) - Jens
3
为伟大的答案投票 - maihabunash
备选方案:您可以通过使用“set -o pipefail”进行初始化,以检查所有命令是否都以0退出。 - Andi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接