39

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

error()
{
  echo $1
  exit 1
}

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

$ fn
Insufficient parameters.
[shell terminates]

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

谢谢

4

5 回答 5

37

要在不退出 shell 的情况下退出函数堆栈,可以使用以下命令:

kill -INT $$

正如比萨所说,这就像按 Ctrl-C 一样,它将停止当前脚本的运行并将您带到命令提示符。

 

 


注意:我没有选择Pizza的答案的唯一原因是因为这被埋在他/她的答案中而没有直接回答。

于 2013-06-17T17:50:03.767 回答
12

你可以做一个

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
}
于 2012-06-21T23:15:38.720 回答
6

您需要向return每个函数添加语句,以检查它们依次调用的任何函数的返回值。获取文件就像将代码剪切并粘贴到当前上下文中,除了$BASH_SOURCE.

或者,您可以定义fn为一个 shell 脚本,这样就可以满足exit您的需求(除非 fork 太贵)。

于 2012-06-21T15:30:59.110 回答
2

usingreturn语句,但调用错误后需要添加return

于 2012-06-21T15:21:08.347 回答
2

shell 并没有真正的异常机制来一次回退许多函数调用。您只需检查返回值并一直手动返回。

于 2012-06-21T15:22:37.270 回答