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

why shell uses 0 as success?

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

OP 询问

Why did the writer of the first shell decide to use 0 for true?

简答: 无法以这种形式回答这个问题, 因为第一个 shell 没有 任何退出状态。

编辑

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

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

发明了shell 由“Louis Pouzin”作为“RUNCOM”工具,在 麻省理工学院的兼容分时系统 read about CTSS, 写在哪里:

Louis Pouzin also invented RUNCOM for CTSS. This facility, the direct ancestor of the Unix shell script, allowed users to create a file-system file of commands to be executed, with parameter substitution. Louis also produced a design for the Multics shell, ancestor of the Unix shell.

另请阅读 this page

“下一级”在 Multics 中,称为 Multics Command Language:

The command language interpreter, the Shell, is normally driven by the Listener.

Its function is to listen for requests in the form of command lines typed in at the user console. In the above command language description, the listener reads in a line from the console, evaluates the line as a command, and re-calls itself to repeat the function.

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

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

  • 作为系统调用退出 当你终止一个 运行 (编译)程序时,(例如,在“C”中使用 exit(N))在现实中你调用 一个 库函数 ,它是连接底层操作系统并正确终止程序的原因。 这意味着“exit(N)”(从 exit 函数的角度来看)是 OS 依赖于实现的。 See Wikipedia
  • shell的退出状态- 已执行命令的退出状态是由 waitpid 系统调用或等效函数编辑的值 return。 Wikipedia。类似 waitpid 的函数通常 return 是前一点的退出状态,但它是 OS 实现相关的。 (ofc,现在由 POSIX 标准化)。

回到历史:

Multics 之后,UNIX 得到了发展。 From this page 我们今天所知道的 shell 有两个前身:

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

如果有兴趣,请通读手册 - 链接为 here

第一次提到“退出代码”是在 Manual of the PWB (aka Mashey) Shell。 所有 shell 的“之前”只讨论:

Termination Reporting

If a command (not followed by "&") terminates abnormally, a message is printed. (All terminations other than exit and interrupt are considered abnormal.)

所以,问题的答案在上面几行, - 符合评论中已经说过的内容:

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

来自 PWB shell manual

的精彩引用

$r is the exit status code of the preceding command. ``0'' is the normal return from most commands.

注意:most 这个词。 :),例如它不是某人在“一瞬间”发明的,而是随着时间的推移而演变的。它非常依赖于底层 OS.

exitwait-like 调用的实现

例如,第一版 UNIX 对 exit(N) 级别一无所知 - 它是一个简单的 exit()wait 没有 return 一个特定的值 - from the The first edition of the Unix Programmer's Manual, dated November 3, 1971

exit is the normal means of terminating a process. All files are closed and the parent process is notified if it is executing a wait.

wait causes its caller to delay until one of its child processes terminates. If any child has already died, return is immediate; if there are no children, return is immediate with the error bit set.

此外,read here - really worth - The Evolution of the Unix Time-sharing System - 关于 forkexecexitwait...

的演变

V7 将退出状态标准化为:

The value of a simple command is its exit status if it terminates normally or 200+status if it terminates abnormally (see signal(2) for a list of status values).

还有:

DIAGNOSTICS Errors detected by the shell, such as syntax errors cause the shell to return a non-zero exit status. If the shell is being used non interactively then execution of the shell file is abandoned. Otherwise, the shell returns the exit status of the last command executed (see also exit).

Howg.. OMG...有人会这么好编辑这个post并纠正我破烂的英语and/or extend/correct上面...

最后 - 对不起伙计们 - 完全是主题 - 但无法抗拒从历史中添加以下 image - 目前知道 Microsoft-XENIX 的用户并不多。 ;)

在大多数处理器中,处理器状态指示最后一条指令是否产生零值。如果为零(或非零)则可以分支,而无需明确与零进行比较(节省指令周期)。如果您的成功率为零,则提供了多种方法 return 失败(并保存说明)。

这实际上是一个非常糟糕的约定。 70 年代的 VMS 操作系统比当今使用的几乎所有系统都更先进。它有一个集中的错误系统,应用程序可以在其中添加自己的错误消息和代码,这些消息和代码将与系统错误代码集成在一起。 VMS系统中,奇数为成功,偶数为失败。

假设您有一个打开文件的函数。您可能有一个成功代码表示它打开了一个现有文件,而另一个成功代码表示它创建了一个新文件。