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

Aqu*_*wer 3 shell bash function exit exit-status

我想知道我们可以使用哪些不会被 ex 误认为的返回值。信号?

前任。:

$sleep 10
$#hit ctrl+c
$echo $?
130
Run Code Online (Sandbox Code Playgroud)

所以我知道我不能使用类似return 130exit 130

所以这会产生误导:

$function FUNC(){ return 130; };FUNC;echo $?
130
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 9

进程的退出状态编码为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||运算符从最后一个命令传递状态。
  • cmpdiff为不同的文件返回 1,为错误条件返回 ?2。
  • expr 如果表达式计算为 0 或 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向上值很少使用,因为它们被烘焙到壳(和POSIX命令commandenvnicenohuptime):

  • 126和127表示调用外部命令失败;
  • 大于 128 的值$?表示命令已被信号终止。

/usr/include/sysexits.h 列出了一些值及其含义,但它来自 sendmail,我从未在与电子邮件传递无关的程序之外看到它。

总之,成功返回 0,失败返回 1 或 2。如果您需要区分故障情况,请从 1 开始并增加更严重故障的值。


Cod*_*ome 5

退出状态约定

从技术上讲,您可以使用 0 到 255 之间的任何值。但是,您可以使用许多现有约定:

  • 退出代码 1 作为一般错误的包罗万象
  • sysexits.h中的退出代码 64-78指示错误类别。您通常可以在/usr/include/sysexits.h中查找这些内容,它是由 Debian/Ubuntu libc6-dev 软件包安装的。
  • errno.h中的退出代码。您还可以使用moreutils 包中的errno命令查找这些内容。在我的系统上,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)

  • `errno.h` 列出了 C 函数的返回代码。它不被外部命令使用。这些值取决于 unix 的风格,并且不在正确的范围内 (0–125)。至于“sysexits.h”,它仅在少数与电子邮件相关的程序中使用,它不是返回码的事实上的标准。 (2认同)

Edw*_*lds 2

您可以使用 0 到 255 之间的任何数字,保留的退出代码除外(单击此处了解更多