我可以在 bash 函数/脚本中使用哪些返回/退出值?

我可以在 bash 函数/脚本中使用哪些返回/退出值?

我想知道我们可以使用哪些返回值,这样就不会被 ex 误认为是。信号情报?

前任。:

$sleep 10
$#hit ctrl+c
$echo $?
130

所以我知道我不能使用类似return 130exit 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&&运算||符传递上一个命令的状态。
  • cmpdiff对于不同的文件返回 1,对于错误情况返回 ≥2。
  • expr如果表达式计算结果为零或 null,则返回 1;如果表达式无效,则返回 2;如果其他错误,则返回 ≥3。
  • grep对于“未找到”返回 1,对于错误情况返回 ≥2。许多搜索命令都遵循这一点(但不是find,如果没有文件匹配则返回 0)。
  • mesg返回 0 表示是,1 表示否,≥2 表示错误。
  • patch如果块被拒绝则返回 1,对于其他错误则返回≥2。
  • sort -c如果文件数据未排序,则返回 1;如果有错误,则返回 ≥2。
  • compresslocaledef为特定错误定义一些小值。

有一个常见但不普遍的观点,即较大的值意味着更严重的失败。对于测试布尔条件的命令,例如grep(此模式是否存在?)和diff(这些文件是否相同?),1 表示“否”,较高的值表示错误。此外,126 以上的值很少使用,因为它们被烘焙到 shell 中(以及 POSIX 命令commandenvnicenohuptime

  • 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 之间的任何数字,除了保留退出代码(点击这里了解更多

相关内容