如何检查管道上的第一个命令是否出现错误?

如何检查管道上的第一个命令是否出现错误?

假设我在终端上执行以下命令:

this-command-doesnt-exist-and-closes-with-code-127 | jq ''

如果我执行,echo $?我会得到0结果,因为它正在检查jq.我想知道管道上第一个命令的退出代码。我考虑过重定向 stderr,如下所示:

this-command-doesnt-exist-and-closes-with-1 2>&1 | jq ''
if [ $? != 0 ]; then
    echo "I got an error"
fi

就这样我发送了一条没有意义的消息jq。它可以解决问题,但看起来不是正确的解决方案。如何获取管道上命令的错误代码?

答案1

如果您正在使用,bash则可以使用set -o pipefail

$ set -o pipefail
$ this-command-doesnt-exist-and-closes-with-code-127 | jq ''
bash: this-command-doesnt-exist-and-closes-with-code-127: command not found...
$ echo $?
127

bash 手册页

管道故障

如果设置,管道的返回值是最后一个(最右边)以非零状态退出的命令的值,如果管道中的所有命令都成功退出,则返回值为零。默认情况下禁用此选项。

相关内容