Bash 忽略错误并获取返回代码



我正在使用set -e在错误时中止。

但是对于特定的一个函数,我想忽略错误,并且在错误时我希望返回函数的代码。

例:

do_work || true 
if [ $? -ne 0 ] 
then
echo "Error"
fi  

但这不是工作返回代码总是由于||true总是真的

如何在错误时获取do_work返回代码?

do_work || {
status=$?
echo "Error"
}

这里给出的几个答案是不正确的,因为它们会导致对一个变量进行测试,如果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。

您可以使用子外壳快捷方式:

( set +e; do_work )
if [ $? -ne 0 ]
then
echo "Error"
fi

希望这有帮助=)

一种方法是使用管道,-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

相关内容

  • 没有找到相关文章

最新更新