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

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

有没有办法可以通过终端命令执行标题中所述的操作,或者我必须查看代码?

答案1

退出代码表示结束程序时成功或失败,它们介于 0 到 255 之间。 shell 及其内置程序可能会专门使用 125 以上的值来指示特定的失败模式,因此代码列表在 shell 和操作系统之间可能有所不同(例如,Bash 使用值 128+作为退出状态)。看:Bash - 3.7.5 退出状态或者man bash

一般来说,一个零退出状态表明命令成功了, 和 非零退出状态指示失败

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

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

/usr/include/sysexits.hLinux 和 BSD/OS X 上的一些 sysexits 列表以及程序的首选退出代码 (64-78) 可以在(或: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 */

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

然而,上述值主要在 sendmail 中使用,并且几乎没有其他人使用,因此它们与标准相差甚远(正如指出的那样)吉尔斯)。

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

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

  • 1- 常见错误的包罗万象

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

    例子:

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

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

    例子:

       empty_function() {}
    
  • 6- 没有这样的设备或地址

    例子:

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

  • 125- 如果命令本身失败(请参阅:核心工具

  • 126- 如果找到命令但无法调用(例如,不可执行)

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

    例子:

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

    可能存在问题$PATH或拼写错误。

    例子:

      $ foo; echo $?
      -bash: foo: command not found
      127
    
  • 128- 无效参数exit

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

    例子:

      $ exit 3.14159
      -bash: exit: 3.14159: numeric argument required
    
  • 128- 254- 致命错误信号“n” - 命令由于接收到信号而终止。将信号代码添加到 128 (128 + SIGNAL) 即可获取状态(Linux: man 7 signal, BSD: man signal),下面是几个示例:

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

    例子:

      $ cat
      ^C
      $ echo $?
      130
    
  • 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
    
  • 143- 命令由信号代码 15 终止 (128+15=143)

    例子:

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

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

    例子:

      $ sh -c 'exit 3.14159'; echo $?
      sh: line 0: exit: 3.14159: numeric argument required
      255
    

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

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

看:

答案2

没有“秘诀”来获取给定终端命令的退出状态的含义。

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

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).

第二谷歌。看获取举个例子。

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

答案3

您必须查看代码/文档。然而,最接近“标准化”的是错误号

答案4

据我所知,只有两个或多或少的标准值——都定义stdlib.h为与 exit() 一起使用:

  • 退出_成功 (=0)
  • 退出_失败 (=1)

唯一事实上的标准值,即对世界上所有程序具有相同含义的,是 0(零),代表成功。

不同的程序引入不同的返回“失败”代码列表来区分或强调不同的错误(不同类型或严重性)。一些程序甚至使用返回值来报告发现的运行时错误的整数(例如,套装中失败的单元测试的数量)。

我不建议引入任何类型的“新标准”来扩展stdlib.h

相关内容