我想知道我们可以使用哪些返回值,这样就不会被 ex 误认为是。信号情报?
前任。:
$sleep 10
$#hit ctrl+c
$echo $?
130
所以我知道我不能使用类似return 130
或exit 130
所以这会产生误导:
$function FUNC(){ return 130; };FUNC;echo $?
130
答案1
进程的退出状态被编码为一个值0 到 255 之间,这就是您可以用作退出代码的全部内容。如果传递超出该范围的值,大多数 shell 会使用模 256 的余数。某些 shell 允许函数使用更广泛的整数值。
退出代码的唯一规则是0表示成功,任何其他值表示失败。这个规则超越了unix:它也是其他操作系统(包括DOS、Windows和许多具有退出代码概念的嵌入式系统,但VMS的做法不同)上的常见约定。在 UNIX 系统中,它被嵌入到 shell 的布尔结构 ( if
, while
, &&
, ||
, !
, set -e
, ...) 中,make
然后是所有标准实用程序。在 POSIX C 程序中,EXIT_SUCCESS
为 0 并且EXIT_FAILURE
是某个非零值(通常为 1)。
没有关于失败退出代码选择的规则(事实上或法律上)。只有少数 POSIX 实用程序强制要求特定的故障状态代码:
!
如果其操作数返回 0,shell 运算符将返回 1。and&&
运算||
符传递上一个命令的状态。cmp
和diff
对于不同的文件返回 1,对于错误情况返回 ≥2。expr
如果表达式计算结果为零或 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 以上的值很少使用,因为它们被烘焙到 shell 中(以及 POSIX 命令command
、env
、nice
和nohup
)time
:
- 126和127表示调用外部命令失败;
- 高于 128 的值
$?
表示命令被信号终止。
/usr/include/sysexits.h
列出了一些值及其含义,但它来自 sendmail,我从未在与电子邮件传递无关的程序之外看到过它。
总之,成功返回 0,失败返回 1 或 2。如果您需要区分故障情况,请从 1 开始,并针对更严重的故障增加该值。
答案2
退出状态约定
从技术上讲,您可以使用 0 到 255 之间的任何值。但是,您可以使用许多现有约定:
- 退出代码 1 作为包罗万象的一般错误。
- 退出代码 64-78 来自sysexits.h来指示错误的类别。您通常可以在以下位置查找这些内容/usr/include/sysexits.h,它由 Debian/Ubuntu libc6-dev 软件包安装。
- 退出代码来自错误号。您还可以使用以下命令查找这些内容错误号来自 moreutils 包的命令。在我的系统上,
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
答案3
您可以使用 0 到 255 之间的任何数字,除了保留退出代码(点击这里了解更多)