lec*_*tif 399 bash return function return-value exit
BASH函数中的return
and exit
语句与退出代码有什么区别?
Die*_*lla 291
从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.
Sie*_*geX 282
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"
Run Code Online (Sandbox Code Playgroud)
$ ./test.sh
this is retfunc()
We are still here
this is exitfunc()
Run Code Online (Sandbox Code Playgroud)
Mik*_*e Q 52
我认为没有人真正完全回答这个问题,因为他们没有描述如何使用这两个问题.好吧我想我们知道退出会杀死脚本,无论它在哪里被调用,你也可以为它分配状态,例如退出或退出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"
}
Run Code Online (Sandbox Code Playgroud)
像这样检查:
if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi
Run Code Online (Sandbox Code Playgroud)
或者像这样:
isdirectory || echo "not a directory"
Run Code Online (Sandbox Code Playgroud)
在此示例中,测试可用于指示是否找到目录.请注意,返回后的任何内容都不会在函数中执行.0为true但shell中的false为1,与其他prog langs不同.
有关功能的更多信息:http: //www.linuxjournal.com/content/return-values-bash-functions
注意:isdirectory功能仅用于指导目的.这不应该是您在真实脚本中执行此类选项的方式.
小智 30
请记住,函数是脚本的内部函数,通常使用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).
Run Code Online (Sandbox Code Playgroud)
如果您的函数只是以没有return语句结束,则执行的最后一个命令的状态将作为状态代码返回(并将被放入$?
).
请记住,返回和退出时会返回0到255之间的状态代码$?
.你不能把任何东西塞进状态代码(例如返回"cat"); 不起作用.但是,脚本可以使用状态代码传回255种不同的失败原因.
您可以设置调用脚本中包含的变量,或者在函数中使用echo结果并在调用脚本中使用命令替换; 但返回和退出的目的是传递状态代码,而不是像C这样的编程语言所期望的值或计算结果.
Jur*_*raj 22
有时,您使用.
或运行脚本source
.
. a.sh
Run Code Online (Sandbox Code Playgroud)
如果包括exit
在a.sh
,它不会只是终止脚本,但最终你的shell会话.
如果包含return
在a.sh
,它只是停止处理脚本.
简单来说(主要是编码中的新手),我们可以说,
`return` : exits the function,
`exit()` : exits the program(called as process while running)
Run Code Online (Sandbox Code Playgroud)
另外如果你观察到,这是非常基本的,但......
`return` : is the keyword
`exit()` : is the function
Run Code Online (Sandbox Code Playgroud)
OP 的问题:BASH 函数中的 return 和 exit 语句相对于退出代码有什么区别?
首先,需要澄清一些问题:
不需要 (return|exit) 语句来终止 (function|shell) 的执行。当 (function|shell) 到达其代码列表末尾时,即使没有 (return|exit) 语句,它也会终止。
不需要 (return|exit) 语句来从终止的 (function|shell) 传回值。每个进程都有一个内置变量,$?
该变量始终具有数值。它是一个特殊变量,不能像“?=1”那样设置,但只能以特殊方式设置(见下面的*)。
美元的价值?在(称为函数 | 子 shell)中执行的最后一个命令之后是传递回(函数调用者 | 父 shell)的值。无论执行的最后一个命令是(“return [n]”|“exit [n]”)还是简单的(“return”或恰好是被调用函数代码中的最后一个命令的其他命令)都是如此。
在上面的项目符号列表中,从“(x|y)”中选择,要么始终是第一项,要么始终是第二项,以分别获取有关函数和 return 或 shell 和 exit 的语句。
显而易见的是,它们都共享特殊变量的共同用法,以便$?
在终止后向上传递值。
$?
* 现在介绍一下可以设置的特殊方式:
$?
终止函数中的最终值。$?
父 shell 中的值将等于$?
已终止的子 shell 中的最终值。$?
根据其结果进行修改。但有些人则不然。$?
用它们的参数进行设置,并终止执行。值得注意的是,$?
可以通过在子 shell 中调用 exit 来赋值,如下所示:
# (exit 259)
# echo $?
3
Run Code Online (Sandbox Code Playgroud)
exit
终止当前流程 ; 有或没有退出代码,考虑这个系统不仅仅是一个程序功能.请注意,在采购时,exit
将结束shell,但是,在运行时将只是exit
脚本.
return
从函数返回到调用后的指令,有或没有返回码.return
是可选的,它隐含在函数的末尾.return
只能在函数内部使用.
我想在源代码时添加它exit
,在不杀死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"
Run Code Online (Sandbox Code Playgroud)
执行以下操作:
user$ ./test
Whatever is not available
user$
Run Code Online (Sandbox Code Playgroud)
test
- 并且 - shell将关闭.
user$ . ./test
Whatever is not available
Run Code Online (Sandbox Code Playgroud)
只会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
Run Code Online (Sandbox Code Playgroud)
现在,在这两种情况下只会test
退出.
归档时间: |
|
查看次数: |
372491 次 |
最近记录: |