如何终止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@DavidBenKnoblereturn
将从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()(…)
。