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

时间:2012-10-22 11:23:46

标签: bash

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

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

示例:

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

但它不起作用返回代码始终为真到期||真的

如何在出错时获取do_work上的返回码?

5 个答案:

答案 0 :(得分:7)

您可以使用子shell快捷方式:

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

希望这有助于=)

答案 1 :(得分:6)

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

答案 2 :(得分:6)

这里给出的一些答案是不正确的,因为如果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。

答案 3 :(得分:4)

一种方法是使用管道,-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包含管道本身,则可能会出现问题。

答案 4 :(得分:1)

do_work || status=$?
if [ $status -ne 0 ]
then
    echo "Oh no - Fail whale $status has arrived"
fi