假设我在终端上执行以下命令:
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 手册页:
管道故障
如果设置,管道的返回值是最后一个(最右边)以非零状态退出的命令的值,如果管道中的所有命令都成功退出,则返回值为零。默认情况下禁用此选项。