退出函数堆栈而不退出shell

时间:2012-06-21 15:06:47

标签: bash function shell exit

我正在写一个剧本然后遇到了一个奇怪的问题。如果我发来一个包含一堆函数的脚本,这些函数可以调用一个输出字符串然后退出的错误函数,它将退出我的shell。我知道它为什么这样做。这是因为函数调用与调用者处于相同的进程空间中(至少它在bash中),因此函数中的退出使用提供的退出代码终止当前进程。例如:

error()
{
  echo $1
  exit 1
}

fn()
{
  if [ $# == 0 ]; then
    error "Insufficient parameters."
  fi
  # do stuff
}

$ fn
Insufficient parameters.
[shell terminates]

所以我的问题是,我可以退出函数堆栈中的所有函数而不终止当前的shell而不会生成新的子shell吗?

由于

5 个答案:

答案 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实际上没有一个异常机制可以一次性重绕多个函数调用。您只需检查返回值并手动完全返回。