有没有办法写一个bash函数中止整个执行,不pipe它是怎么被调用的?

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

function func() { echo "Goodbye" exit 1 } echo "Function call will abort" func echo "This will never be printed" 

但是后来我意识到,这样做的时候不会这样做:

 res=$(func) 

我明白,我创build了一个子shell和“退出1”中止该子shell,而不是主要的….

但是有没有办法编写一个函数来中止整个执行,不pipe它是怎么调用的? 我只需要得到真正的返回值(由函数回应)。

可以做什么,注册顶级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" 

所以,你的函数发送一个TERM信号返回到顶层shell,使用提供的命令捕获和处理,在本例中为"exit 1"

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

 set -e func set +e 

或者获取返回值:

 (func) || exit $? 

subprocess不能强制父进程隐式closures。 你需要使用某种信号机制。 选项可能包括一个特殊的返回值,或者可能发送一些信号kill ,类似的东西

 function child() { local parent_pid="$1" local other="$2" ... if [[ $failed ]]; then kill -QUIT "$parent_pid" fi } 

但是有没有办法编写一个函数来中止整个执行,不pipe它是怎么调用的?

没有。

我只需要得到真正的返回值(由函数回应)。

您可以

 res=$(func) echo $?