据我了解,unix shell shell 脚本可以而且应该发出退出代码。退出代码为零表示程序成功完成,而正整数退出代码 (1-255) 表示程序退出时出现错误。
做任何 - Unix 系统吗?贝壳? (不确定要使用的术语)--保留这些 255 错误退出代码中的任何一个以获得特定含义吗?即我正在创建一个命令行程序,我希望成为一个行为良好的unix公民——我可以安全地让我的程序返回任何非零退出代码并且该代码对我的程序有意义吗?或者我的程序是否不应该使用某些退出代码,因为系统本身会以特定方式解释它们?
答案1
(编辑,从答案中窃取,由问题评论引用,最终指出这里)。
在 shell 脚本中,针对某些条件提供了超过 128 的虚假退出状态,因此最好避免这些情况。 (虽然 ssh 使用 255,但不以这种方式使用)。
低于 128 的两个退出状态也用于表示某些 shell 错误,因此您通常也不想使用这些代码。
BSD 继续尝试标准化一些退出代码,从 64 开始。如果您爱上它们,我认为使用它们没有任何问题(搜索 sysexit.h,它不是正式标准,因此您必须复制它)。如果您不使用这个,那么“小于 64”是比 126 更好的整数:-P。也就是说,外壳和内核都不会关心这些。它们在协作程序之间使用 - 特别是用于邮件程序组件。如果你想要超过 63 个“错误”状态,我不会担心这些状态在 Unix 中被“保留”。
系统调用接口本身也称为内核,并不真正关心。在系统调用中,特殊的退出状态被编码带外0-255 范围内。这就是 shell 检测并打印由 SIGKILL 终止的命令的状态“Killed”的方式。这种带外信息无法通过任何简单的exit
调用来伪造。
如果地位不为 NULL,等待() 和等待进程() 存储状态信息整数它所指向的。可以使用以下宏检查该整数(这些宏将整数本身作为参数,而不是指向它的指针,如在 等待() 和等待进程()!):
妻子出轨了(地位)如果子进程正常终止,即通过调用,则返回 true出口(3) 或_出口(2),或者从main()返回。
我们退出状态(地位)返回子进程的退出状态。这由最低有效 8 位组成地位孩子在调用中指定的参数出口(3) 或_出口(2) 或作为 main() 中 return 语句的参数。仅应在以下情况下使用此宏 妻子出轨返回 true。
WIF信号(地位)如果子进程被信号终止,则返回 true。
WTERMSIG(地位)返回导致子进程终止的信号编号。仅应在以下情况下使用此宏WIF信号返回 true。
WCOREDUMP(地位)如果子进程生成了核心转储,则返回 true。仅应在以下情况下使用此宏 WIF信号返回 true。该宏未在 POSIX.1-2001 中指定,并且在某些 UNIX 实现(例如 AIX、SunOS)上不可用。仅使用 #ifdef WCOREDUMP ... #endif 中包含的此项。
WIF 已停止(地位)如果子进程因信号传递而停止,则返回 true;仅当调用完成时才可能使用温特瑞德或者当孩子被追踪时(参见跟踪(2))。
WSTOPSIG(地位)返回导致子进程停止的信号编号。仅应在以下情况下使用此宏无线网络停止返回 true。
WIF续(地位)(自 Linux 2.6.10 起)如果子进程通过传递恢复,则返回 true 信号控制。
和
ssh 以远程命令的退出状态退出,如果发生错误,则以 255 退出。
和
$ a
bash: a: command not found...
$ echo $?
127
$ /dev/null
bash: /dev/null: Permission denied
$ echo $?
126