我正在写一个剧本然后遇到了一个奇怪的问题。如果我发来一个包含一堆函数的脚本,这些函数可以调用一个输出字符串然后退出的错误函数,它将退出我的shell。我知道它为什么这样做。这是因为函数调用与调用者处于相同的进程空间中(至少它在bash中),因此函数中的退出使用提供的退出代码终止当前进程。例如:
error()
{
echo $1
exit 1
}
fn()
{
if [ $# == 0 ]; then
error "Insufficient parameters."
fi
# do stuff
}
$ fn
Insufficient parameters.
[shell terminates]
所以我的问题是,我可以退出函数堆栈中的所有函数而不终止当前的shell而不会生成新的子shell吗?
由于
答案 0 :(得分:33)
要在不退出shell的情况下退出函数堆栈,可以使用以下命令:
kill -INT $$
正如pizza所述,这就像按下Ctrl-C一样,这将停止当前脚本的运行并将您放到命令提示符下。
注意:我没有选择pizza的答案的唯一原因是因为这被埋没在他/她的答案中而没有直接回答。
答案 1 :(得分:7)
你可以做一个
exit() { return $1;}
然后
source ./your_script
在回答怀疑论者时,这只影响当前的shell,它不会影响你产生的shell。
信息量更大的表格可以
exit() {
local ans
local line
read -p "You really want to exit this? " line
ans=$(echo $line)
case "$ans" in
Y);;
y);;
*)kill -INT $$;;
esac
unset -f exit
exit $1
}
答案 2 :(得分:6)
您需要为每个函数添加return
语句,以检查它们依次调用的任何函数的返回值。获取文件就像将代码剪切并粘贴到当前上下文中一样,除了$BASH_SOURCE
之类的变量之外,还有一些例外。
或者,您可以将fn
定义为shell脚本,以便exit
可以执行您想要的操作(除非fork太昂贵)。
答案 3 :(得分:2)
使用return
语句,但需要在调用错误后添加return
答案 4 :(得分:2)
shell实际上没有一个异常机制可以一次性重绕多个函数调用。您只需检查返回值并手动完全返回。