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

mai*_*ash 8 linux bash shell exit-code

我做了一个简单的脚本:

$ more test.bash
#!/bin/bash
echo test
exit 1
Run Code Online (Sandbox Code Playgroud)

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

$ /tmp/test.bash
echo $?
1
Run Code Online (Sandbox Code Playgroud)

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

/tmp/test.bash | tr -d '\r' 1>>$LOG 2>>$LOG
echo $?
0
Run Code Online (Sandbox Code Playgroud)

退出状态为0,(不符合预期1)

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

为了从脚本中获取正确的退出状态,而不是从管道后面的命令中获取正确的退出状态,我需要在语法中添加/更改什么?

Jen*_*ens 22

使用PIPESTATUS数组:

$ ls foo | cat
ls: foo: No such file or directory
$ echo ${PIPESTATUS[0]} ${PIPESTATUS[1]}
2 0
Run Code Online (Sandbox Code Playgroud)

注意:PIPESTATUS是一种基础(即不是POSIX).

  • 很高兴帮助一个人类同胞:-) (5认同)
  • 非常非常好,对我来说很新!(+1给你) (2认同)
  • 为伟大的答案投票 (2认同)
  • 这真的很酷+1 (2认同)