有没有办法写一个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 $?