为什么 Linux shell 上的高退出代码 (>= 256) 无法按预期工作?

为什么 Linux shell 上的高退出代码 (>= 256) 无法按预期工作?

我发现了一个奇怪的行为(可以在我的系统上使用 zsh 和 bash 重现):

$ # here everything is still normal
$ bash -c 'exit 1';echo $?
1
$ bash -c 'exit 255';echo $?
255
$ zsh -c 'exit 255';echo $?
255
$ # now it get's crazy
$ bash -c 'exit 256';echo $?
0
$ zsh -c 'exit 256';echo $?
0
$ # (leaving away zsh for now, it is always reproducible with both)
$ bash -c 'exit 257';echo $?
1
$ bash -c 'exit 267';echo $?
11

所以256之后又开始从1开始计数。但为什么?

bash 手册页没有表明有最大数量:

   exit [n]
          Cause  the  shell  to exit with a status of n.  If n is omitted,
          the exit status is that of the last command executed.  A trap on
          EXIT is executed before the shell terminates.

这是一种非常令人困惑的行为。如果程序依赖于此,可能会导致大问题。

那么为什么会发生这种情况呢?为什么没有记录下来?

x64、Fedora 26

答案1

它记录在手册中出口系统功能:

status 的值可以是 0、EXIT_SUCCESS、EXIT_FAILURE、[CX] [Option Start] 或任何其他值,但只有最低有效的 8 位(即 status & 0377)可供等待的父进程使用。 [选项结束]

Linux 似乎非常严格地遵守该标准,并且只允许最后 8 位通过。

答案2

shell 命令的 POSIX 手册页exit(1p)指出:

概要

exit [n]

描述

exit实用程序应使 shell 以无符号十进制整数指定的退出状态退出n。如果n指定但其值不在 0 到 255 之间(包含 0 和 255),则退出状态未定义。

因此,对于符合 POSIX 规范的 shell,这种行为并非没有记录,但也不一定是可移植的。

相关内容