如何终止bash函数的执行

如何终止bash函数的执行,bash,Bash,我的.bashrc中有几个函数,我想在出错时终止整个“运行”。例如: function assert_env() { var_name=$1 if [ -z "${!var_name}" ]; then printf "Missing environment variable: $var_name\n" exit 1 fi } function my_test() { assert_env "abc" print $ab

我的
.bashrc
中有几个函数,我想在出错时终止整个“运行”。例如:

function assert_env()
{
    var_name=$1

    if [ -z "${!var_name}" ]; then
        printf "Missing environment variable: $var_name\n"
        exit 1
    fi
}

function my_test()
{
    assert_env "abc"
    print $abc
}
如果我在终端中键入
my_test
,我想终止执行,但此脚本会关闭终端(如预期的那样-我运行
exit 1

如何在不关闭当前终端的情况下终止执行


< > > >编辑:具体来说,我不想从 AdjtTyEnv返回,如果从 AsjtTyEnv的条件不满足,我希望以下的命令可以执行,如C++ >代码> AsStuts< /Code >

< P>注意,<代码> EXECU/<代码>返回指定给shell本身的退出代码,因此,使用
exit 1
显然会退出您当前的shell。您需要在此处使用
return

就您的需求而言,只需使用函数
assert\u env
中的退出代码来决定是否要运行进一步的语句。此处使用
return
将导致当前函数超出范围,您返回给被调用方的任何代码都可用于检查其是否成功/失败

function assert_env() {
    local ret_val=0; var_name=$1  

    if [ -z "${!var_name}" ]; then
        printf "Missing environment variable: $var_name\n"
        ret_val=1
    fi

    return ${ret_val}
}
现在使用它

function my_test() {
    if ! assert_env "abc"; then
        return
    fi
    # Or could be just written as assert_env "abc" || return
}
这样,如果
assert_env
返回
0
,则
my_test
中的if子句将断言失败,并执行其余代码。当返回
1
时,条件变为真,函数调用将在不退出主scipt的情况下返回


请注意,
function
关键字是非标准的,不符合POSIX,可能无法跨shell工作。如果你想让它变得可移植,只需删除关键字。

我找到了一个解决方法-在子shell中执行函数内容

例如:

function assert_env()
{
    var_name=$1

    if [ -z "${!var_name}" ]; then
        printf "Missing environment variable: $var_name\n"
        exit 1
    fi
}

function my_test()
{
(
    printf "$1\n"

    assert_env "abc"

    printf $abc
)
}

尝试
return
——这有点像退出functions@DavidBenKnoble
return
将从
assert\u env
返回,它不会终止整个调用堆栈。您可以使用
kill-s 17$$
发送SIGSTOP,或者更适合你的case@Felics:在
.bashrc
中定义的函数在同一个shell中执行,这就是发送
退出1
终止当前shell的原因。AFAIK无法通过shell中的函数调用处理异常。正如您所说,
exit
最终将退出shell,
return
不会退出函数堆栈。我会检查返回值并手动返回所有堆栈调用。+1谢谢!这是可行的,但不会减少代码大小。基本上,我用另一个
if
替换了一个
if
,我想删除调用中的
if
scode@Felics:好的,如果条件句在
my_test
中困扰您,只需使用
assert_env“abc”| return
有趣的事实,如果您有括号,您不需要大括号:
my_test()(…)