有没有办法可以通过终端命令执行标题中所述的操作,或者我必须查看代码?
答案1
退出代码表示结束程序时成功或失败,它们介于 0 到 255 之间。 shell 及其内置程序可能会专门使用 125 以上的值来指示特定的失败模式,因此代码列表在 shell 和操作系统之间可能有所不同(例如,Bash 使用值 128+氮作为退出状态)。看:Bash - 3.7.5 退出状态或者man bash
。
一般来说,一个零退出状态表明命令成功了, 和 非零退出状态指示失败。
要检查命令返回哪个错误代码,您可以打印$?
最后一个退出代码,或者${PIPESTATUS[@]}
给出退出状态值的列表 管道(在 Bash 中)shell 脚本退出后。
没有可以找到的所有退出代码的完整列表;然而,有人尝试在内核源代码中系统化退出状态号。但这主要针对 C/C++ 程序员,并且类似的脚本标准可能是合适的。
/usr/include/sysexits.h
Linux 和 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)。
看:
- 附录 E. 具有特殊含义的退出代码高级 Bash 脚本指南
- 编写更好的 Shell 脚本 - 第 2 部分在创新中心
答案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