为什么shell使用0作为成功?

kod*_*r16 6 shell operating-system

在 C 和许多其他语言中,0 表示 false,1(或非零)表示 true。在 shell 中,进程状态的 0 表示成功,非零表示错误。Shell if 语句本质上使用 0 表示 true。为什么第一个 shell 的作者决定使用 0 表示 true?

jm6*_*666 5

OP询问有关

为什么第一个 shell 的作者决定使用 0 表示 true?

简短的回答: 不可能以这种形式回答这个问题,因为第一个 shell没有任何退出状态。

编辑

因为@John Kugelman 要求总结,所以这个答案有点长。

第二个、第三个和第 N 个 shell 也没有任何可以称为“退出状态”的东西。对于近似的正确答案,需要深入历史。

shell是由“Louis Pouzin”发明的“RUNCOM”工具,在 MIT 的兼容分时系统中 阅读了有关 CTSS 的内容其中写道:

Louis Pouzin 还为 CTSS 发明了 RUNCOM。该工具是 Unix shell 脚本的直接祖先,允许用户通过参数替换创建要执行的命令的文件系统文件。Louis 还为 Multics shell(Unix shell 的祖先)进行了设计。

另请阅读此页

“下一个级别”是 Multics,称为Multics 命令语言

命令语言解释器(Shell)通常由监听器驱动。

它的功能是监听在用户控制台输入的命令行形式的请求。在上面的命令语言描述中,侦听器从控制台读取一行,将该行计算为命令,然后重新调用自身以重复该函数。

它没有任何可以称为“退出状态”的东西。 程序调用terminate{file/process} procedure,停止程序执行。

这是最重要的一点之一。需要区分

  • 作为系统调用的退出 当您终止正在运行(编译)的程序(例如,在“C”中使用)时,exit(N)实际上您调用了库函数,什么使桥接至底层操作系统并正确终止程序。这意味着“exit(N)”(从退出函数的角度来看)是操作系统实现相关的。 参见维基百科
  • shell 的退出状态 - 执行命令的退出状态是waitpid系统调用或等效函数返回的值。 维基百科。waitpid 之类的函数通常返回前一点的退出状态,但它与操作系统实现相关。(ofc,现在由 POSIX 标准化)。

回到历史:

Multics 之后,UNIX 得到了发展。从本页来看 ,shell我们今天知道有两个前身:

  • Thompson shell(版本 1 到版本 6) - 如果有人感兴趣,这里维护了 v6 的可运行版本。
  • 程序员工作台 [PWB]外壳
  • 我们今天知道的第一个 shell 是Bourne shell V7

如果有兴趣,请阅读手册 - 链接位于此处

第一次提到“退出代码”是在 PWB(又名 Mashey)Shell 手册中。所有“之前”的 shell 只讨论:

终止报告

如果命令(后面不跟“&”)异常终止,则会打印一条消息。(除了退出和中断之外的所有终止都被视为异常。)

因此,问题的答案在上面几行中, - 与评论中已经说过的一致:

  • 因为将退出代码读取为错误代码。0-表示没有错误。>0 一些错误。
  • 可能是因为只有一种成功模式和多种失败模式。

来自PWB 外壳手册的精彩引用

$r 是前面命令的退出状态代码。“0”是大多数命令的正常返回。

注意:大多数这个词。:),例如,它不是某人在“某一时刻”发明的,而是随着时间的推移而演变的。它非常紧密地依赖于底层操作系统中的exit和调用的实现。wait-like

例如,UNIX 的第一个版本对级别一无所知exit(N)- 它很简单exit()并且wait没有返回特定值 -来自Unix 程序员手册第一版,日期为 1971 年 11 月 3

exit是终止进程的正常方式。所有文件都会关闭,并且如果父进程正在执行等待,则会收到通知。

wait导致其调用者延迟,直到其子进程之一终止。如果任何孩子已经死亡,则立即返回;如果没有子项,则立即返回并设置错误位。

另外,请阅读这里 - 真正值得 - Unix 分时系统的演变fork- 关于、和...exec的演变exitwait

V7 将退出状态标准化为:

简单命令的值是其退出状态(如果正常终止)或 200+status(如果异常终止)(有关状态值列表,请参阅 signal(2))。

还:

诊断 shell 检测到的错误(例如语法错误)会导致 shell 返回非零退出状态。如果 shell 正在以非交互方式使用,则 shell 文件的执行将被放弃。否则,shell 返回最后执行的命令的退出状态(另请参见 exit)。

Howg..天哪...有人可以很好地编辑这篇文章并纠正我蹩脚的英语和/或扩展/纠正上面的内容...

最后 - 对不起各位 - 完全是这个主题 - 但无法抗拒添加历史记录中的以下图像- 没有多少当前用户知道 Microsoft-XENIX。;) 在此输入图像描述