9

set -e用来中止错误。

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

例子:

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

但这不是工作返回码总是正确的,因为|| 真的

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

4

5 回答 5

10

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

于 2015-08-18T22:41:26.943 回答
8

您可以使用 subshel​​l 快捷方式:

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

希望这会有所帮助=)

于 2012-10-22T11:57:27.690 回答
8
do_work || {
    status=$?
    echo "Error"
}
于 2012-10-22T15:17:26.883 回答
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包含管道本身,这可能会出现问题。

于 2012-10-22T12:42:14.167 回答
1
do_work || status=$?
if [ $status -ne 0 ]
then
    echo "Oh no - Fail whale $status has arrived"
fi
于 2012-10-22T15:33:44.547 回答