Bash函数中返回和退出之间的区别

Difference between return and exit in Bash functions

对于退出代码,bash函数中的returnexit语句有什么区别?


man bashreturn [n]; </P >

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.

…………………是exit [n]: </P >

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 >

为你的每个编辑的问题,对退出代码,return有什么做用的退出代码。退出代码是用于应用程序/脚本,而不是函数。所以在这方面,唯一的关键字的那一集的退出代码的脚本(一个被抓住了,可以通过调用程序使用$?壳变),是exit。。。。。。。 </P >

编辑:2 </P >

我的最后一句话是referring exit致因的一些评论。它被制造的differentiate returnexit所理解的OP,和在事实上,在任何给定的点A的程序/ shell脚本,exit是只读的通系的结局与境的脚本代码的调用的过程。 </P >

每一个命令行executed壳中产生一个本地的"退出代码":它集的$?变到那和代码,可以使用与if&&和其他运营商的条件执行其他commands。。。。。。。 </P >

这些退出代码(和值的变量$?)是由各复位命令的执行。 </P >

incidentally,退出代码的最后一个命令行executed通过脚本是用于为退出代码的脚本本身作为一个由调用的过程。 </P >

finally,函数,当为法,为壳commands(相对于的退出代码。在退出代码的函数(在函数),是集通过使用return。。。。。。。所以,当在一个函数的return 0是运行的函数的执行terminates,给西安的退出代码0。 </P >


return威尔,因为目前的函数去"超出范围",而exit会因为在脚本到端的点,这是被称为。这里是一个抽样程序的帮助explain这个: </P >

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在$?)。 </P >

记住,回传给境和反向的状态代码,从0到255,可用在$?。。。。。。。你不能穿别人的东西变成一个状态代码(例如,返回的"猫");它将不会工作。但是,一个脚本可以通反向255不同原因失败的方法中使用的状态代码。 </P >

你可以设置变量包含在调用脚本,或结果的回波中的函数和使用命令替换在调用脚本;但用途(IRR和境是通的状态代码,而不是值或该结果作为一个可能希望在一个编程语言像C。 </P >


有时,使用.source运行脚本。

1
. a.sh

如果在a.sh中包含一个exit,它将不仅终止脚本,而且结束shell会话。

如果在a.sh中包含return,它只会停止处理脚本。


简单来说(主要是新手在编码),我们可以说,

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只能在函数内部使用。

我想补充一点,在获得源代码的同时,从函数内部执行exit脚本而不杀死shell是不容易的。我认为,在"测试"脚本中有一个示例更好

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$

test和壳将关闭。

1
2
user$ . ./test
Whatever is not available

只有test会结束,并显示提示。

解决方案是将可能的程序包含在()中。

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

现在,在这两种情况下,只有test将退出。


操作问题: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


首先,return是关键字,exit是函数。

也就是说,这里有一个最简单的解释。

return它从函数返回一个值。

exit它退出或放弃当前外壳。