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)
第三: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- 如果命令本身失败,请参阅:coreutils126 - 如果找到命令但无法调用(例如不可执行)
权限问题或命令不是可执行文件。
例子:
$ /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)。
看:
| 归档时间: |
|
| 查看次数: |
90843 次 |
| 最近记录: |