Bash函数中的返回语句和退出语句在退出代码方面有什么区别?
当前回答
首先,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是一个函数。
也就是说,这里有一个最简单的解释。
返回
它从函数中返回一个值。
exit
它退出或放弃当前shell。
有时,使用。或来源。
. a.sh
如果在a.s sh中包含了一个exit,它不仅会终止脚本,还会结束shell会话。
如果在a.h sh中包含一个返回值,它就会停止处理脚本。
简单来说(主要针对编程新手),我们可以说:
`return`: exits the function,
`exit()`: exits the program (called as process while running)
如果你观察一下,这是非常基本的,但是…
`return`: is the keyword
`exit()`: is the function
Exit终止当前进程;不管有没有退出码,都应该把它看作一个系统,而不是一个程序函数。注意,当使用源时,exit将结束shell。但是,在运行时,它将退出脚本。 从函数返回,返回到调用后的指令,带或不带返回码。Return是可选的,在函数末尾是隐式的。Return只能在函数内部使用。
我想补充一点,在获取源代码的同时,不杀死shell而从函数中退出脚本并不容易。我认为,“测试”脚本上的示例更好:
#!/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$
测试后,外壳会闭合。
user$ . ./test
Whatever is not available
只有测试将完成,并显示提示。
解决方案是将潜在的过程包含在(和)中:
#!/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将退出。
推荐文章
- Linux Bash中双&和分号有什么区别?
- 在Bash中模拟do-while循环
- 如何以及为什么'a'['toUpperCase']()在JavaScript工作?
- 如何从Python函数中返回两个值?
- 在Bash中将输出赋给变量
- 错误:无法找到函数…在R
- 如何在Mac OS X 10.6中使硬件发出哔哔声
- 在编写自己的函数时,如何使用R的省略号特性?
- Rust中的默认函数参数
- 从Docker容器获取环境变量
- 如何重定向标准derr和标准输出到不同的文件在同一行脚本?
- 如何循环通过一个目录递归删除具有某些扩展名的文件
- 在Bash中获取日期(比当前时间早一天)
- Linux: kill后台任务
- 在OSX中永久设置PATH环境变量