如何在用-e调用的bash脚本中获取子命令的状态?

如何在用-e调用的bash脚本中获取子命令的状态?,bash,Bash,我希望使用-e选项编写bash脚本,以便在出现任何错误时停止,但希望允许特定行返回不同于零的错误代码,并在逻辑中使用它: #/bin/bash -e do_something_and_return_errcode if [ $? -eq 2 ]; then specific_stuff fi 脚本通常以do\u something\u和\u return\u errcode结尾。我可以通过这样做来避免 do_something_and_return_errcode || true 但

我希望使用-e选项编写bash脚本,以便在出现任何错误时停止,但希望允许特定行返回不同于零的错误代码,并在逻辑中使用它:

#/bin/bash -e
do_something_and_return_errcode
if [ $? -eq 2 ]; then
    specific_stuff
fi
脚本通常以
do\u something\u和\u return\u errcode
结尾。我可以通过这样做来避免

do_something_and_return_errcode || true

但是这会使
$?
返回
0
,我不能使用
$PIPESTATUS
,因为这不是管道。

使用Charles Duffy建议的解决方案:

将此职位留作参考:

你可以管它,考虑下面的例子:

% cat pipetst.sh
#!/bin/bash
set -e
false | true
printf "Pipe: %d, exit: %d\n" "${PIPESTATUS[0]}" "$?"
% ./pipetst.sh
Pipe: 1, exit: 0
这是一种黑客行为,不应该在生产代码中使用,我更愿意删除
set-e
,并在需要的地方实现错误处理

如果您需要将输出转到标准输出,您可以通过管道转到猫:

(echo hello; exit 1) | cat

使用Charles Duffy建议的解决方案:

将此职位留作参考:

你可以管它,考虑下面的例子:

% cat pipetst.sh
#!/bin/bash
set -e
false | true
printf "Pipe: %d, exit: %d\n" "${PIPESTATUS[0]}" "$?"
% ./pipetst.sh
Pipe: 1, exit: 0
这是一种黑客行为,不应该在生产代码中使用,我更愿意删除
set-e
,并在需要的地方实现错误处理

如果您需要将输出转到标准输出,您可以通过管道转到猫:

(echo hello; exit 1) | cat

首先,使用
set-e
是一种很好的做法,但并没有得到普遍认可

也就是说,考虑一下:

err=0
do_something_and_return_errcode || err=$?
另一个选项是临时禁用该标志:

set +e ## disable the effect of bash -e / set -e
do_something_and_return_errcode; err=$?
set -e ## ...and reenable that flag after

首先,使用
set-e
是一种很好的做法,但并没有得到普遍认可

也就是说,考虑一下:

err=0
do_something_and_return_errcode || err=$?
另一个选项是临时禁用该标志:

set +e ## disable the effect of bash -e / set -e
do_something_and_return_errcode; err=$?
set -e ## ...and reenable that flag after

您可以使用
PIPESTATUS
查看所有管道命令的返回状态。请参阅Bash手册页中关于“Pipelines”和“PIPESTATUS”Shell变量的部分。如果最后一个命令始终成功,则脚本将不会退出,因为
set-e

> cat /tmp/emptyfile | grep "sometext" | echo "OK"; echo ${PIPESTATUS[@]}
OK
cat: /tmp/emptyfile: No such file or directory
1 1 0
> touch /tmp/emptyfile
> cat /tmp/emptyfile | grep "sometext" | echo "OK"; echo ${PIPESTATUS[@]}
OK
0 1 0
> echo "Find sometext here" > /tmp/emptyfile
> cat /tmp/emptyfile | grep "sometext" | echo "OK"; echo ${PIPESTATUS[@]}
OK
0 141 0

您可以使用
PIPESTATUS
查看所有管道命令的返回状态。请参阅Bash手册页中关于“Pipelines”和“PIPESTATUS”Shell变量的部分。如果最后一个命令始终成功,则脚本将不会退出,因为
set-e

> cat /tmp/emptyfile | grep "sometext" | echo "OK"; echo ${PIPESTATUS[@]}
OK
cat: /tmp/emptyfile: No such file or directory
1 1 0
> touch /tmp/emptyfile
> cat /tmp/emptyfile | grep "sometext" | echo "OK"; echo ${PIPESTATUS[@]}
OK
0 1 0
> echo "Find sometext here" > /tmp/emptyfile
> cat /tmp/emptyfile | grep "sometext" | echo "OK"; echo ${PIPESTATUS[@]}
OK
0 141 0

这是一个比我上面发布的更好的建议。这是一个比我上面发布的更好的建议。