Bash函数中return
和exit
语句与退出代码有什么区别?
答案 0 :(得分:272)
来自man bash
上的return [n]
;
使函数停止执行并将n指定的值返回给其调用者。如果省略n,则返回状态是函数体中执行的最后一个命令的状态。
... exit [n]
:
导致shell退出状态为n。如果省略n,则退出状态是最后执行的命令的状态。在shell终止之前执行EXIT上的陷阱。
修改强>
根据您对问题的修改,关于退出代码,return
与退出代码无关。退出代码适用于应用程序/脚本,而非功能。所以在这方面,唯一设置脚本退出代码的关键字(调用程序可以使用$?
shell变量捕获的那个)是exit
。
编辑2:
我上次发表exit
的陈述引起了一些评论。它是为了区分return
和exit
以区分OP,事实上,在任何程序/ shell脚本的给定点,exit
是使用退出代码结束脚本到调用进程的唯一方法。
在shell中执行的每个命令都会生成一个本地“退出代码”:它将$?
变量设置为该代码,并可与if
,&&
和其他运算符一起使用有条件地执行其他命令。
每个命令执行都会重置这些退出代码(以及$?
变量的值)。
顺便提一下,脚本执行的最后一个命令的退出代码用作调用进程看到的脚本本身的退出代码。
最后,函数在被调用时,作为退出代码的shell命令。函数的退出代码(在函数内)使用return
设置。因此,当运行函数return 0
时,函数执行终止,退出代码为0。
答案 1 :(得分:263)
return
将导致当前函数超出范围,而exit
将导致脚本在调用它的位置结束。这是一个示例程序,可以帮助解释这个:
#!/bin/bash
retfunc()
{
echo "this is retfunc()"
return 1
}
exitfunc()
{
echo "this is exitfunc()"
exit 1
}
retfunc
echo "We are still here"
exitfunc
echo "We will never see this"
$ ./test.sh
this is retfunc()
We are still here
this is exitfunc()
答案 2 :(得分:47)
我认为没有人真正完全回答这个问题,因为他们没有描述如何使用这两个问题。好吧我想我们知道退出会杀死脚本,无论它在哪里被调用,你也可以为它分配状态,例如退出或退出0或退出7等等。这可以用来确定如果被另一个脚本等调用,脚本被强制停止的方式等。退出时就足够了。
调用时返回将返回指定的值以指示函数的行为,通常为1或0.例如:
#!/bin/bash
isdirectory() {
if [ -d "$1" ]
then
return 0
else
return 1
fi
echo "you will not see anything after the return like this text"
}
像这样检查:
if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi
或者像这样:
isdirectory || echo "not a directory"
在此示例中,测试可用于指示是否找到目录。请注意,返回后的任何内容都不会在函数中执行。 0为真,但shell中的false为1,与其他编程语言不同。
有关功能的更多信息: http://www.linuxjournal.com/content/return-values-bash-functions
注意:isdirectory功能仅用于指导目的。这不应该是您在真实脚本中执行此类选项的方式。
答案 3 :(得分:29)
请记住,函数是脚本的内部函数,通常使用return语句从它们调用它们。调用外部脚本完全是另一回事,脚本通常以exit语句终止。
BASH函数中的返回和退出语句与退出代码之间的差异很小。两者都返回状态,而不是值。状态为零表示成功,而任何其他状态(1到255)表示失败。 return语句将返回到调用它的脚本,而exit语句将从遇到它的整个脚本结束。
return 0 # returns to where the function was called. $? contains 0 (success).
return 1 # returns to where the function was called. $? contains 1 (failure).
exit 0 # exits the script completely. $? contains 0 (success).
exit 1 # exits the script completely. $? contains 1 (failure).
如果您的函数只是以没有return语句结束,则执行的最后一个命令的状态将作为状态代码返回(并将放在$?
中)。
请记住,返回和退出会返回0到255之间的状态代码,可在$?
中找到。你不能把任何东西塞进状态代码(例如返回“cat”);不起作用。但是,脚本可以使用状态代码传回255种不同的失败原因。
您可以设置调用脚本中包含的变量,或者在函数中使用echo结果并在调用脚本中使用命令替换;但返回和退出的目的是传递状态代码,而不是像C那样的编程语言所期望的值或计算结果。
答案 4 :(得分:21)
有时,您使用.
或source
运行脚本。
. a.sh
如果在exit
中包含a.sh
,它不会终止脚本,而是结束shell会话。
如果您在return
中加入a.sh
,则只会停止处理该脚本。
答案 5 :(得分:6)
简单来说(主要是编码中的新手),我们可以说,
`return` : exits the function,
`exit()` : exits the program(called as process while running)
另外如果您观察到,这是非常基本的,但是......,
`return` : is the keyword
`exit()` : is the function
答案 6 :(得分:5)
exit
终止当前进程;有或没有退出代码,考虑这个系统不仅仅是一个程序功能。请注意,在采购时,exit
将结束shell,但运行时只会exit
脚本。
return
返回调用后的指令,
有或没有返回代码。 return
是可选的,它是隐含的
在功能的最后。 return
只能在函数中使用。
我希望在获取源代码时添加它,在不杀死shell的情况下从函数内部exit
脚本并不容易。我想,一个例子在“测试”脚本上更好
#!/bin/bash
function die(){
echo ${1:=Something terrible wrong happen}
#... clean your trash
exit 1
}
[ -f /whatever/ ] || die "whatever is not available"
# now we can proceed
echo "continue"
执行以下操作:
user$ ./test
Whatever is not available
user$
test
- 并且 - shell将关闭。
user$ . ./test
Whatever is not available
仅test
完成,系统会显示提示。
解决方案是将可能的程序包含在(
和)
#!/bin/bash
function die(){
echo $(1:=Something terrible wrong happen)
#... clean your trash
exit 1
}
( # added
[ -f /whatever/ ] || die "whatever is not available"
# now we can proceed
echo "continue"
) # added
现在,在这两种情况下,只有test
会退出。
答案 7 :(得分:2)
OP的问题: BASH函数中的return和exit语句与退出代码有什么区别?
事实上,需要做出一些澄清:
在上面的项目符号列表中,选择"(x | y)"要么始终是第一项,要么总是第二项,以获得关于功能和声明的陈述返回或贝壳&分别退出。
显而易见的是,它们都共享特殊变量$的常用用法?在终止后向上传递值。
*现在以$?的特殊方式?可以设置:
值得注意的是$?可以通过在子shell中调用exit来为其赋值,如下所示:
# (exit 259)
# echo $?
3
答案 8 :(得分:1)
首先,exit
是一个关键字,return
我的朋友是一个功能。
那就是说,这是最简单的解释。
<强> exit
强>
它从函数返回一个值。
<强> <EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLength="10"/>
强>
它退出或放弃当前的shell。
答案 9 :(得分:1)
为其他一些答案添加一个可操作的方面:
两者都可以给出退出代码 - 默认或由函数定义,唯一的“默认”为零表示退出和返回都成功。任何状态都可以有一个自定义数字 0-255,包括成功。
Return 通常用于在当前 shell 中运行的交互式脚本,例如使用 . script.sh
调用,并且只是将您返回到您的调用 shell。然后调用 shell 可以访问返回代码 - $?
为您提供定义的返回状态。
在这种情况下,退出还会关闭您的 shell(包括 SSH 连接,如果您是这样工作的)。
如果脚本可执行并从另一个脚本或 shell 调用并在子 shell 中运行,则需要退出。然后调用 shell 可以访问退出代码 - 在这种情况下 return 会给出错误。
答案 10 :(得分:0)
如果将bash脚本转换为函数,通常将exit N
替换为return N
。调用该函数的代码将对返回值的处理与对子进程的退出代码进行处理一样。
在函数内部使用exit
将迫使整个脚本结束。