如何获取命令/实用程序的退出代码(和/或返回代码)列表和含义?

pre*_*ise 30 documentation exit command

有什么方法可以执行终端命令中标题中所述的操作,还是必须查看代码?

cha*_*aos 22

没有“配方”可以获取给定终端命令的退出状态的含义。

我的第一次尝试是联机帮助页:

user@host:~# man ls 
   Exit status:
       0      if OK,

       1      if minor problems (e.g., cannot access subdirectory),

       2      if serious trouble (e.g., cannot access command-line argument).
Run Code Online (Sandbox Code Playgroud)

第二谷歌。以wget为例。

第三:shell 的退出状态,例如 bash。Bash 及其内置函数可能会特别使用 125 以上的值。127 表示未找到命令,126 表示命令不可执行。有关详细信息,请参阅bash 退出代码


ken*_*orb 19

退出代码表示结束程序时的失败条件,它们介于 0 和 255 之间。 shell 及其内置程序可能特别使用 125 以上的值来指示特定的失败模式,因此代码列表可能因 shell 和操作系统(例如 Bash使用值 128+N 作为退出状态)。请参阅:Bash - 3.7.5 退出状态man bash

通常,零退出状态表示命令成功非零退出状态表示失败

要检查命令返回哪个错误代码,您可以打印$?最后一个退出代码,或者在 shell 脚本退出后${PIPESTATUS[@]}给出来自管道(在 Bash 中)的退出状态值列表。

没有可以找到的所有退出代码的完整列表,但是已经尝试将内核源代码中的退出状态编号系统化,但这主要用于 C/C++ 程序员,并且类似的脚本标准可能是合适的。

Linux 和 BSD/OS X 上的一些 sysexit 列表以及程序的优选退出代码(64-78)可以在/usr/include/sysexits.h(或:man sysexits在 BSD 上)找到:

0   /* successful termination */
64  /* base value for error messages */
64  /* command line usage error */
65  /* data format error */
66  /* cannot open input */
67  /* addressee unknown */
68  /* host name unknown */
69  /* service unavailable */
70  /* internal software error */
71  /* system error (e.g., can't fork) */
72  /* critical OS file missing */
73  /* can't create (user) output file */
74  /* input/output error */
75  /* temp failure; user is invited to retry */
76  /* remote error in protocol */
77  /* permission denied */
78  /* configuration error */
/* maximum listed value */
Run Code Online (Sandbox Code Playgroud)

上面的列表从 64-78 分配了以前未使用的退出代码。未分配的退出代码的范围将在未来进一步受到限制。

但是,以上值主要用于 sendmail 并且几乎没有其他人使用,因此它们与标准并不遥远(如@Gilles所指出的那样))。

在 shell 中,退出状态如下(基于 Bash):

  • 1- 125- 命令没有成功完成。检查命令的手册页以了解状态的含义,下面是几个示例:

  • 1 - 捕捉一般错误

    杂项错误,例如“除以零”和其他不允许的操作。

    例子:

    $ let "var1 = 1/0"; echo $?
    -bash: let: var1 = 1/0: division by 0 (error token is "0")
    1
    
    Run Code Online (Sandbox Code Playgroud)
  • 2 - 滥用 shell 内置函数(根据 Bash 文档)

    缺少关键字或命令,或权限问题(以及失败的二进制文件比较时的差异返回代码)。

    例子:

     empty_function() {}
    
    Run Code Online (Sandbox Code Playgroud)
  • 6 - 没有这样的设备或地址

    例子:

    $ curl foo; echo $?
    curl: (6) Could not resolve host: foo
    6
    
    Run Code Online (Sandbox Code Playgroud)
  • 124 - 命令超时

  • 125- 如果命令本身失败,请参阅:coreutils
  • 126 - 如果找到命令但无法调用(例如不可执行)

    权限问题或命令不是可执行文件。

    例子:

    $ /dev/null
    $ /etc/hosts; echo $?
    -bash: /etc/hosts: Permission denied
    126
    
    Run Code Online (Sandbox Code Playgroud)
  • 127 - 如果找不到命令,为执行它而创建的子进程将返回该状态

    可能有问题$PATH或打字错误。

    例子:

    $ foo; echo $?
    -bash: foo: command not found
    127
    
    Run Code Online (Sandbox Code Playgroud)
  • 128 - 无效的论据 exit

    exit 只接受 0 - 255 范围内的整数参数。

    例子:

    $ exit 3.14159
    -bash: exit: 3.14159: numeric argument required
    
    Run Code Online (Sandbox Code Playgroud)
  • 128- 254- 致命错误信号“n” - 命令因接收信号而终止。信号码加到128(128+SIGNAL)上就可以得到状态(Linux: man 7 signal, BSD: man signal),下面举几个例子:

  • 130 - 由于按下 Ctrl-C,命令终止,130-128=2 (SIGINT)

    例子:

    $ cat
    ^C
    $ echo $?
    130
    
    Run Code Online (Sandbox Code Playgroud)
  • 137- 如果命令被发送KILL(9)信号(128+9),否则命令的退出状态

    kill -9 $PPID 的脚本。

  • 141 —— SIGPIPE - 在没有阅读器的管道上书写

    例子:

    $ hexdump -n100000 /dev/urandom | tee &>/dev/null >(cat > file1.txt) >(cat > file2.txt) >(cat > file3.txt) >(cat > file4.txt) >(cat > file5.txt)
    $ find . -name '*.txt' -print0 | xargs -r0 cat | tee &>/dev/null >(head /dev/stdin > head.out) >(tail /dev/stdin > tail.out)
    xargs: cat: terminated by signal 13
    $ echo ${PIPESTATUS[@]}
    0 125 141
    
    Run Code Online (Sandbox Code Playgroud)
  • 143 - 命令以信号代码 15 终止 (128+15=143)

    例子:

    $ sleep 5 && killall sleep &
    [1] 19891
    $ sleep 100; echo $?
    Terminated: 15
    143
    
    Run Code Online (Sandbox Code Playgroud)
  • 255* - 退出状态超出范围。

    exit 只接受 0 - 255 范围内的整数参数。

    例子:

    $ sh -c 'exit 3.14159'; echo $?
    sh: line 0: exit: 3.14159: numeric argument required
    255
    
    Run Code Online (Sandbox Code Playgroud)

根据上表,退出代码 1 - 2、126 - 165 和 255 具有特殊含义,因此应避免用于用户指定的退出参数。

请注意,超出范围的退出值可能会导致意外退出代码(例如,退出 3809 给出的退出代码为 225、3809 % 256 = 225)。

看:


Tho*_*erk 5

您将不得不查看代码/文档。然而,最接近“标准化”的是errno.h

  • `errno.h` 与退出代码无关,只有错误消息。 (5认同)