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

时间:2015-08-04 09:42:34

标签: bash exit-code

我希望能够创建一个bash函数,可以在管道之前读取命令的退出代码。我不确定是否可以访问它。

  • echo "1" | grep 2返回1状态代码
  • echo "1" | grep 1返回0状态代码

现在我想添加第三个命令来读取状态,使用管道:

  • echo "1" | grep 2 | echo $?将回显“0”,即使状态代码为1。

我知道我可以使用echo "1" | grep 2 && echo "0" || echo "1",但我更愿意使用管道来编写它。

无论如何他们都这样做(如果它在大多数shell上工作会更好,比如bash,sh和zsh)

2 个答案:

答案 0 :(得分:3)

您必须在管道的下一个阶段之前获得退出状态。像

这样的东西
exec 3> debug.txt
{ echo "1"; echo "$?" >&3; } | long | command | here

您无法(轻松)将其封装在函数中,因为它需要传递正确引用的字符串并通过eval执行它:

debug () {
    eval "$@"
    echo $? >&3
}

# It looks easy in this example, but it won't take long to find
# an example that breaks it.
debug echo 1 | long | command | here

您必须将退出状态写入不同的文件描述符,否则会干扰发送到管道中下一个命令的输出。

答案 1 :(得分:1)

在bash中,您可以使用PIPESTATUS变量

执行此操作
echo "1" | grep 1
echo ${PIPESTATUS[0]} # returns 0
echo "1" | grep 2
echo ${PIPESTATUS[0]} # returns 0
echo "1" | grep 2
echo ${PIPESTATUS[1]} # returns 1