我的印象是exit
无论如何都会终止当前的bash脚本,并且在我的脚本顶部有以下错误处理程序:
function err {
printf "\e[31m$1\e[0m\n" 1>&2
exit 1
}
对于大多数情况来说,它就像一个魅力,直到这一行:
item=$(myfunc $1)
通常,该行正常工作,myfunc的STDOUT按预期转储到$item
。当myfunc
通过上面看到的err
函数抛出错误时会出现问题。 $()
最终会吞下非零返回并保护退出退出脚本本身。如果我理解正确,问题是$()
实际上产生了一个新的子shell(就像被弃用的反引号一样),但我知道没有其他方法可以将函数的输出捕获到bash中允许{的变量{1}}工作。
我也试过使用exit
,但也没有运气。有人可以建议如何构建我的错误处理程序,以便即使在这些情况下它也会退出脚本吗?
答案 0 :(得分:5)
您可以测试作业的结果:
if item=$(myfunc "$1")
then : Function worked
else : Function failed
fi
这将测试$(…)
使用的子shell中运行的命令的退出状态。
如果没有实际使用功能,您可以尝试:
$ if item=$(echo Hi; exit 1); then echo "$item - OK"; else echo "$item - OH"; fi
Hi - OH
$ if item=$(echo Hi; exit 0); then echo "$item - OK"; else echo "$item - OH"; fi
Hi - OK
$
或者,如果功能被认为是至关重要的,那么:
$ err() { exit $1; }
$ myfunc() { echo Mine; err $1; }
$ if item=$(myfunc 1); then echo "$item - OK"; else echo "$item - OH"; fi
Mine - OH
$ if item=$(myfunc 0); then echo "$item - OK"; else echo "$item - OH"; fi
Mine - OK
$
在Mac OS X 10.11 El Capitan上使用Bash 3.2.57进行测试。
答案 1 :(得分:0)
为了什么值得你也不能使用bash短路评估来测试函数的退出状态。它改为测试对变量的赋值。
例如。 而
[[ $(myfunc "$1") ]] && echo success || echo failure
或
[[ myfunc "$1" ]] && echo success || echo failure
相当普遍,可能会做出预期的事情,
[[ item=$(myfunc "$1") ]] && echo success || echo failure
即使myfunc返回非零,也始终返回成功。你必须使用if then else来测试退出状态。