Bash函数中的返回语句和退出语句在退出代码方面有什么区别?
当前回答
如果将Bash脚本转换为函数,则通常将退出N替换为返回N。调用该函数的代码将把返回值视为子进程的退出代码。
在函数中使用exit将强制整个脚本结束。
其他回答
首先,return是一个关键字,exit是一个函数。
也就是说,这里有一个最简单的解释。
返回
它从函数中返回一个值。
exit
它退出或放弃当前shell。
从man bash on return [n];
使函数停止执行并将n指定的值返回给调用者。如果省略n,返回状态为函数体中最后执行的命令。
... 退出[n]:
使shell以状态n退出。如果省略n,退出状态为最后执行的命令。EXIT上的trap在shell终止之前执行。
编辑:
根据你对问题的编辑,关于退出码,return和退出码没有关系。退出码用于应用程序/脚本,而不是函数。因此,在这方面,唯一设置脚本退出码的关键字(调用程序使用$?Shell变量)是退出。
编辑2:
我提到退出的最后一句话引起了一些评论。这样做是为了区分return和exit,以便理解OP,事实上,在程序/shell脚本的任何给定点上,exit是使用调用进程的退出代码结束脚本的唯一方法。
在shell中执行的每个命令都会产生一个本地“退出码”:它设置$?变量,可以与if, &&和其他操作符一起使用,有条件地执行其他命令。
这些退出码(以及$?变量)将在每次命令执行时重置。
顺便提一下,脚本执行的最后一个命令的退出码被用作调用进程看到的脚本本身的退出码。
最后,函数在被调用时,作为关于退出代码的shell命令。函数的退出码(在函数内)是通过使用return设置的。因此,当在函数中运行return 0时,函数执行将终止,并给出0的退出码。
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()
如果将Bash脚本转换为函数,则通常将退出N替换为返回N。调用该函数的代码将把返回值视为子进程的退出代码。
在函数中使用exit将强制整个脚本结束。
简单来说(主要针对编程新手),我们可以说:
`return`: exits the function,
`exit()`: exits the program (called as process while running)
如果你观察一下,这是非常基本的,但是…
`return`: is the keyword
`exit()`: is the function