有没有办法编写一个bash函数来中止整个执行,无论它是如何被调用的?

LiM*_*Mar 70 bash function exit subshell

我在我的bash函数中使用"exit 1"语句来终止整个脚本,它工作正常:

function func()
{
   echo "Goodbye"
   exit 1
}
echo "Function call will abort"
func
echo "This will never be printed"
Run Code Online (Sandbox Code Playgroud)

但后来我意识到,当调用它时它不起作用:

res=$(func)
Run Code Online (Sandbox Code Playgroud)

据我所知,我创建了一个子shell,"退出1"中止了子shell而不是主要的....

有没有办法编写一个中止整个执行的函数,无论它如何被调用?我只需要获得真正的返回值(由函数回应).

Fat*_*ror 79

可以做的是,注册顶级shell以便TERM退出信号,然后发送TERM到顶级shell:

#!/bin/bash
trap "exit 1" TERM
export TOP_PID=$$

function func()
{
   echo "Goodbye"
   kill -s TERM $TOP_PID
}

echo "Function call will abort"
echo $(func)
echo "This will never be printed"
Run Code Online (Sandbox Code Playgroud)

因此,您的函数将TERM信号发送回顶级shell,在这种情况下,使用提供的命令捕获并处理该shell "exit 1".

  • 作品.任何级别的功能嵌套,任何流程......只是工作. (3认同)
  • 当存在介入的子壳时似乎不起作用.请参阅使用`set -E` [here]进行bash的alt解决方案(http://unix.stackexchange.com/questions/48533/exit-shell-script-from-a-subshel​​l) (2认同)

bri*_*ice 36

如果命令以非零状态退出,则可以使用set -e哪个退出:

set -e 
func
set +e
Run Code Online (Sandbox Code Playgroud)

或者获取返回值:

(func) || exit $?
Run Code Online (Sandbox Code Playgroud)

  • 甚至`res = $(func)|| exit` (14认同)
  • 有趣的是我看到了解决方案.主脚本中的"set -e"导致任何返回1(或退出)的函数中止整个执行.不幸的是,"set -e"彻底改变了所有行为,我无法使用它. (3认同)
  • 那种蔑视问题的精神.如果每个函数调用都需要捕获错误本身,那么首先使用`exit`是没有意义的.该功能可以简单地返回./但是,如果`set -e`是全局设置的,这确实很有意义 (2认同)