我set -e
用来中止错误。
但是对于特定的一个函数,我想忽略错误,并且在错误时我想返回函数的代码。
例子:
do_work || true
if [ $? -ne 0 ]
then
echo "Error"
fi
但这不是工作返回码总是正确的,因为|| 真的
如何在错误时获取 do_work 的返回码?
我set -e
用来中止错误。
但是对于特定的一个函数,我想忽略错误,并且在错误时我想返回函数的代码。
例子:
do_work || true
if [ $? -ne 0 ]
then
echo "Error"
fi
但这不是工作返回码总是正确的,因为|| 真的
如何在错误时获取 do_work 的返回码?
这里给出的几个答案是不正确的,因为它们会导致对一个变量进行测试,如果do_work
成功,该变量将是未定义的。
我们还需要覆盖成功的案例,所以答案是:
set -eu
do_work && status=0 || status=1
发帖人的问题有点模棱两可,因为它在文本中说“错误时我想要返回码”,但代码暗示“我总是想要返回码”
为了说明,这里是有问题的代码:
set -e
do_work() {
return 0
}
status=123
do_work || status=$?
echo $status
在这段代码中,打印的值是 123,而不是我们希望的 0。
您可以使用 subshell 快捷方式:
( set +e; do_work )
if [ $? -ne 0 ]
then
echo "Error"
fi
希望这会有所帮助=)
do_work || {
status=$?
echo "Error"
}
一种方法是使用管道,-e
只查看管道最右边的结果:
set -e
do_work | true
retn=${PIPESTATUS[0]}
if (( $retn != 0 ))
then
echo "Error $retn"
fi
echo Ending
我写了一个简单do_work
的方法,exit 42
得到了以下输出:
Error 42
Ending
该PIPESTATUS
数组由 Bash 维护,每个元素给出管道每个部分的返回码。我们需要立即捕获它(因此$retn
),因为它在每个命令中都会被覆盖。
当然,如果您do_work
包含管道本身,这可能会出现问题。
do_work || status=$?
if [ $status -ne 0 ]
then
echo "Oh no - Fail whale $status has arrived"
fi