为什么shell使用0成功?

时间:2015-02-24 20:47:34

标签: shell operating-system

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

2 个答案:

答案 0 :(得分:2)

OP询问

  

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

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

修改

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

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

发明了 shell by" Louis Pouzin"作为" RUNCOM"工具,在 麻省理工学院的兼容时间共享系统 read about CTSS, 写在哪里:

  

Louis Pouzin还为CTSS发明了RUNCOM。这个设施,   Unix shell脚本的直接祖先,允许用户创建   带参数的要执行的命令的文件系统文件   代换。路易斯还为Multics外壳制作了一个设计,   Unix shell的祖先。

另请阅读this page

"下一级"在Multics中,被称为 Multics Command Language

  

命令语言解释器Shell通常由   听众。

     

它的功能是以命令行的形式监听请求   在用户控制台输入。在上面的命令语言中   描述,监听器从控制台读取一行,进行评估   将该行作为命令,并重新调用自身以重复该功能。

它没有任何可以称为"退出状态" 的内容。 程序调用{​​{1}}, 是什么阻止了程序的执行。

这是最重要的一点。

之间需要区分
  • 退出系统调用 当您在现实中终止正在运行(已编译)的程序时(例如,在" C"使用terminate{file/process} procedure)中 一个库函数,是桥接到底层操作系统并正确终止程序的原因。 这意味着,"退出(N)" (从退出函数的角度来看)是依赖于OS的实现。 See Wikipedia
  • shell的退出状态 - 已执行命令的退出状态是exit(N)系统调用或等效函数返回的值。 Wikipedia。像函数一样的waitpid通常返回前一点的退出状态,但它依赖于OS实现。 (ofc,现在由POSIX标准化)。

回到历史:

在Multics之后,UNIX得到了开发。 From this page 我们所知道的waitpid有两个前辈:

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

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

第一次提到"退出代码"在里面 Manual of the PWB (aka Mashey) Shell。 所有贝壳"之前"仅讨论:

  

终止报告

     

如果命令(未跟随"&")异常终止,   打印一条消息。 (退出以外的所有终止   和中断被认为是异常。)

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

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

来自PWB shell manual

的好引用
  

$ r是上一个命令的退出状态代码。   ``0''是大多数命令的正常回报。

请注意:字词。 :),例如它并非发明在"片刻"由某人,但它是在时间进化。它非常依赖于底层操作系统中shellexit调用的实现。

例如,UNIX的第一个版本对wait-like级别一无所知 - 这是一个简单的exit(N)exit()没有返回特定值 - {{3 } from

  

退出是终止流程的常用方法。所有文件都是   如果正在执行等待,则会通知父进程。

     

等待会导致其调用者延迟,直到其子进程之一终止。如果任何孩子已经死亡,立即返回;如果   没有子节点,返回是立即设置的错误位。

另外,The first edition of the Unix Programmer's Manual, dated November 3, 1971 - 关于waitforkexecexit ......

的演变

V7将退出状态标准化为:

  

simple-command的值是它   退出状态,如果它正常终止或200 +状态,如果它   异常终止(参见信号(2)获取状态列表   值)。

也:

  

<强>诊断   shell检测到的错误,例如语法错误导致   shell返回非零退出状态。如果是的话   以非交互方式使用然后执行shell   文件被放弃了。否则,shell返回出口   执行最后一个命令的状态(另请参见退出)。

Howg .. OMG ...有人可以编辑这篇文章并纠正我破碎的英语和/或扩展/纠正上述内容......

最后 - 抱歉的人 - 完全是主题 - 但无法在历史记录中添加以下read here - really worth - The Evolution of the Unix Time-sharing System - 目前没有多少用户知道Microsoft-XENIX。 ;) enter image description here

答案 1 :(得分:-1)

在大多数处理器中,处理器状态指示最后一条指令是否产生零值。如果没有明确地与零比较(保存指令周期),则可以分支零(或非零)。如果取得成功,则会提供多种方法来返回失败(并保存指令)。

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

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