我发现了一个奇怪的行为(可以在我的系统上使用 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,这种行为并非没有记录,但也不一定是可移植的。