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".
bri*_*ice 36
如果命令以非零状态退出,则可以使用set -e哪个退出:
set -e
func
set +e
Run Code Online (Sandbox Code Playgroud)
或者获取返回值:
(func) || exit $?
Run Code Online (Sandbox Code Playgroud)