【发布时间】:2016-02-26 00:58:43
【问题描述】:
我的印象是exit 无论如何都会终止当前的 bash 脚本,并且在我的脚本顶部有以下错误处理程序:
function err {
printf "\e[31m$1\e[0m\n" 1>&2
exit 1
}
在这行之前,它在大多数情况下都很有效:
item=$(myfunc $1)
通常,该行工作正常,myfunc 的 STDOUT 按预期转储到$item。当myfunc 通过上面看到的err 函数引发错误时,就会出现问题。 $() 最终吞下了非零返回并保护退出脚本本身退出。如果我理解正确,问题是$() 实际上产生了一个新的子shell(就像不推荐使用的反引号一样),但我知道没有其他方法可以将函数的输出捕获到允许exit 的 bash 中的变量中上班。
我也尝试使用set -e,但也没有运气。有人可以建议如何构建我的错误处理程序,以便即使在这些情况下也能退出脚本?
【问题讨论】:
-
$()最终吞噬了一切,因为 command-substitution 在 subshell 中进行。关于 subshell 的 bash 规则是什么? 在子 shell 中所做的任何事情都不会影响父进程... 是的,您可以返回退出状态 ($?),但您不能做任何其他事情。
标签: bash