如果我有一个函数:
myfunction() {
[ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
global_var=somevalue
}
我从另一个函数中调用它:
some_other_function() {
myfunction
# Do something with "$global_var"
}
这按预期工作:如果条件myfunction
失败,错误退出将终止整个脚本以防止执行其他代码。
在重构与其他脚本(在源文件中)共享函数定义的非常大的脚本时,我想通过返回一些全局变量来删除它们,如下所示:
myfunction() {
[ -d somedirectory ] && [ "some other condition" ] || { echo "error" >&2 ; exit 1; }
local somevar=somevalue
# do stuff with "$somevar", then...
# return value of somevar to calling function.
printf %s "$somevar"
}
some_other_function() {
local anothervar="$(myfunction)"
# Do something with "$another_var"
}
但是,此处的错误退出未能按预期工作。它不会杀死脚本,而只会杀死该函数,该函数由于命令替换而在子 shell 中执行。
有没有办法模块化这个大型脚本以允许从函数返回文本值(而不是使用全局变量)并且仍然允许函数从整个脚本中错误退出?
答案1
您必须向主 shell 发送信号:
# start of the main script:
MAIN_SHELL_PID=$$
[...]
myfunction() {
... || { echo "error" >&2 ; kill -HUP "$MAIN_SHELL_PID"; }
}
答案2
一个更简单的解决方案是将本地声明和赋值写在两个单独的语句中:这会导致函数的退出状态作为赋值的退出状态保留下来,从而有助于在函数发生错误时杀死 while 脚本:
some_other_function() {
local anothervar
anothervar="$(myfunction)"
# Do something with "$another_var"
}