关于shell:大于255的退出代码,可能吗?

ExitCodes bigger than 255, possible?

如果是,则在哪个操作系统上运行Shell或其他操作系统?

请考虑以下Java程序(我仅以Java为例,此问题适合任何语言,更多有关操作系统):

1
2
3
4
5
public class ExitCode {
    public static void main(String args[]) {
        System.exit(Integer.parseInt(args[0]));
    }
}

在Linux和bash上运行它,它总是返回小于255的值,例如 (echo $?打印先前执行的命令的退出代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> java ExitCode 2; echo $?
2

> java ExitCode 128; echo $?
128

> java ExitCode 255; echo $?
255

> java ExitCode 256; echo $?
0

> java ExitCode 65536; echo $?
0

编辑:下面的(仅到目前为止)答案完全解释了UNIX上发生的情况。 我仍然想知道其他操作系统。


在Unix及其衍生版本上是不可能的。返回的退出状态信息由两个8位字段组成,一个包含退出状态,另一个包含有关死亡原因的信息(0表示在程序控制下有序退出,其他值指示信号将其杀死,并指示是否杀死了该信号。核心已弃用)。


在现代Windows上,操作系统本身以及默认的控制台外壳(CMD.EXE)至少在整个32位带符号整数范围内接受并显示退出代码。在CMD.EXE中运行上面的示例将给出您要求的退出代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> java ExitCode 2
> echo %errorlevel%
2

> java ExitCode 128
> echo %errorlevel%
128

> java ExitCode 255
> echo %errorlevel%
255

> java ExitCode 256
> echo %errorlevel%
256

> java ExitCode 65536
> echo %errorlevel%
65536

Windows并没有真正意义上的Unix信号的概念,也没有试图劫持出口代码以添加额外的信息,因此只要您的shell(或最终读取出口代码的任何程序)都不这样做,您应该找回返回的退出代码。幸运的是,使用Microsoft C运行时的程序(包括使用MS Visual C ++编译的所有程序)会保留退出程序的退出代码。


Windows有更多的退出代码,超过14,000。 (我确信您经常在自己的屏幕上看到其中的一些)。

来了:

  • Windows退出代码列表。
  • 使用PowerShell脚本对其进行测试。