我正在使用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