Difference between return and exit in Bash functions
对于退出代码,bash函数中的
从
Causes a function to stop executing and return the value specified by n to its caller. If n is omitted, the return status is that of the last command executed in the function body.
…………………是
Cause the shell to exit with a status of n. If n is omitted, the exit status is that of the last command executed. A trap on EXIT is executed before the shell terminates.
编辑: </P >
为你的每个编辑的问题,对退出代码,
编辑:2 </P >
我的最后一句话是referring
每一个命令行executed壳中产生一个本地的"退出代码":它集的
这些退出代码(和值的变量
incidentally,退出代码的最后一个命令行executed通过脚本是用于为退出代码的脚本本身作为一个由调用的过程。 </P >
finally,函数,当为法,为壳commands(相对于的退出代码。在退出代码的函数(在函数),是集通过使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #!/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" |
输出
1 2 3 4 | $ ./test.sh this is retfunc() We are still here this is exitfunc() |
我不认为有人真正完全回答了这个问题,因为他们没有描述这两个问题是如何使用的。好的,我想我们知道exit会终止脚本,在调用脚本的地方,您可以为它分配一个状态,例如exit或exit 0或exit 7等等。这可以用来确定如果在退出时被另一个脚本等调用得足够多,脚本是如何被强制停止的。
调用时返回将返回指定的值以指示函数的行为,通常为1或0。例如:
1 2 3 4 5 6 7 8 9 10 | #!/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" } |
检查如下:
1 | if isdirectory $1; then echo"is directory"; else echo"not a directory"; fi |
或者像这样:
1 | isdirectory || echo"not a directory" |
在本例中,测试可用于指示是否找到目录。请注意,返回之后的任何内容都不会在函数中执行。0是对的,但shell中的false是1,与其他程序语言不同。
有关函数的详细信息:http://www.linuxjournal.com/content/return-values-bash-functions
注意:isdirectory功能仅用于教学目的。这不应该是您在真实脚本中执行此类选项的方式。
记住,是内部函数的脚本和normally回报从whence他们称为通过使用返回语句。调用的外部脚本是另一个entirely物,和脚本通常Terminate与境的声明。 </P >
"差分"之间的回报与退出声明在Bash函数与相对于退出代码"是非常小的。返回一个两状态,没有价值的。A状态的零indicates成功,在任何其他的现状(1到255)indicates A的故障。在返回的声明将返回到脚本中,它被称为,而在退出声明将终结在整个脚本中无论它是encountered。。。。。。。 </P >
1 2 3 4 5 6 7 | 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). |
如果你的函数的简单的末端与好的回报,在状态的最后一个命令行executed是returned为状态代码(和将placed在
记住,回传给境和反向的状态代码,从0到255,可用在
你可以设置变量包含在调用脚本,或结果的回波中的函数和使用命令替换在调用脚本;但用途(IRR和境是通的状态代码,而不是值或该结果作为一个可能希望在一个编程语言像C。 </P >
有时,使用
1 | . a.sh |
如果在
如果在
简单来说(主要是新手在编码),我们可以说,
1 2 | `return` : exits the function, `exit()` : exits the program(called as process while running) |
另外,如果你观察到,这是非常基本的,但是…
1 2 | `return` : is the keyword `exit()` : is the function |
exit 终止当前进程;无论是否有退出代码,都将其视为系统而非程序功能。注意,在寻源时,exit 将结束shell,但是,在运行时,脚本将仅exit 结束。函数的
return 在调用后返回到指令,有或没有返回码。return 是可选的,它是隐式的在函数的末尾。return 只能在函数内部使用。
我想补充一点,在获得源代码的同时,从函数内部执行
1 2 3 4 5 6 7 8 9 10 | #!/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" |
执行以下操作:
1 2 3 | user$ ./test Whatever is not available user$ |
1 2 | user$ . ./test Whatever is not available |
只有
解决方案是将可能的程序包含在
1 2 3 4 5 6 7 8 9 10 11 12 | #!/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 |
现在,在这两种情况下,只有
操作问题:bash函数中的return和exit语句与exit代码有什么区别?
首先,需要澄清:
- 终止(函数外壳程序)的执行不需要(RETURN EXIT)语句。(函数shell)将在到达其代码列表末尾时终止,即使没有(return exit)语句也是如此。
- (RETURN EXIT)语句不需要从终止的(函数shell)返回值。每个进程都有一个内置变量$?它总是有一个数值。它是一个特殊变量,不能设置为"?=1",但仅以特殊方式设置(见下文*)。美元的价值?在(被称为函数子shell)中执行的最后一个命令之后,是传递回(函数调用者父shell)的值。不管最后执行的命令是("return[n]"""exit[n]")还是plain("return"或其他什么,这恰好是被调用函数代码中的最后一个命令,都是正确的。
在上面的项目符号列表中,从"(x_y)"中选择Always the first item或Always the second item,分别获取关于函数和返回或shells&exit的语句。
很明显,它们都有特殊变量$的共同用法?终止后向上传递值。
*现在,为了特殊的方式,那美元?可以设置:
- 当被调用函数终止并返回给它的调用方时,$?在调用方中,将等于最终值$?在终止的函数中。
- 当父shell隐式或显式地等待单个子shell并通过终止该子shell释放时,那么$?在父shell中,将等于最终值$?在终止的子外壳中。
- 一些内置函数可以修改$?取决于他们的结果。但有些则不然。
- 内置函数"return"和"exit",后面跟一个数字参数,两者都是$?并终止执行。
值得注意的是,美元?可以通过调用子shell中的exit来分配值,如下所示:
1 2 3 | # (exit 259) # echo $? 3 |
首先,
也就是说,这里有一个最简单的解释。