Aqu*_*wer 3 shell bash function exit exit-status
我想知道我们可以使用哪些不会被 ex 误认为的返回值。信号?
前任。:
$sleep 10
$#hit ctrl+c
$echo $?
130
Run Code Online (Sandbox Code Playgroud)
所以我知道我不能使用类似return 130
或exit 130
所以这会产生误导:
$function FUNC(){ return 130; };FUNC;echo $?
130
Run Code Online (Sandbox Code Playgroud)
进程的退出状态编码为0 到 255 之间的值,因此您可以将其用作退出代码。如果传递超出该范围的值,大多数 shell 使用余数取模 256。某些 shell 允许函数的整数值范围更广。
退出代码的唯一规则是0 表示成功,任何其他值表示失败。这条规则超越了 unix:它也是其他操作系统(包括 DOS、Windows 和许多具有退出代码概念的嵌入式系统,但 VMS 的处理方式不同)的通用约定。在 unix 系统中,它被烘焙到 shell 的布尔结构(if
, while
, &&
, ||
, !
, set -e
, ...)、 intomake
和所有标准实用程序中。在 POSIX C 程序中,EXIT_SUCCESS
为 0 并且EXIT_FAILURE
是某个非零值(通常为 1)。
没有关于选择失败退出代码的规则(事实上的或法律上的)。只有少数 POSIX 实用程序要求特定的故障状态代码:
!
shell 运算符的操作数返回 0,则其返回 1。&&
and||
运算符从最后一个命令传递状态。cmp
并diff
为不同的文件返回 1,为错误条件返回 ?2。expr
如果表达式计算为 0 或 null,则返回 1,对于无效表达式返回 2,对于其他错误返回 ?3。grep
“未找到”返回 1,错误情况返回 ?2。许多搜索命令遵循此(但不是find
,如果没有文件匹配则返回 0)。mesg
返回 0 表示是,1 表示否,?2 表示错误。patch
如果大块被拒绝,则返回 1,其他错误则返回 ?2。sort -c
如果文件数据未排序,则返回 1,错误时返回 ?2。compress
并localedef
为特定错误定义一些小值。有一个普遍但不普遍的想法,即较大的值意味着更糟糕的失败。对于测试布尔条件的命令,例如grep
(此模式是否存在?)和diff
(这些文件是否相同?),1 表示“否”,更高的值表示错误。另外,从126向上值很少使用,因为它们被烘焙到壳(和POSIX命令command
,env
,nice
,nohup
和time
):
$?
表示命令已被信号终止。/usr/include/sysexits.h
列出了一些值及其含义,但它来自 sendmail,我从未在与电子邮件传递无关的程序之外看到它。
总之,成功返回 0,失败返回 1 或 2。如果您需要区分故障情况,请从 1 开始并增加更严重故障的值。
从技术上讲,您可以使用 0 到 255 之间的任何值。但是,您可以使用许多现有约定:
errno --list
当前运行显示 134 个定义的错误。一般来说,最好记录脚本中使用的退出代码,或者至少记录您遵循的约定。在退出之前显示独特的消息也可能很有用,例如:
# using sysexits.h
echo "EX_USAGE: invalid argument: $1" > /dev/stderr
exit 64
# using errno.h
echo "ENOENT: File not found: $file" > /dev/stderr
exit 2
Run Code Online (Sandbox Code Playgroud)