在C和许多其他语言中,0表示假,1表示(或非零) 意思是真的。在shell 0中,进程状态意味着成功 非零意味着错误。 Shell if语句基本上使用0 真的。为什么第一个shell的编写者决定使用0表示 真?
答案 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}}, 是什么阻止了程序的执行。
这是最重要的一点。
之间需要区分terminate{file/process} procedure
)中
一个库函数,是桥接到底层操作系统并正确终止程序的原因。
这意味着,"退出(N)" (从退出函数的角度来看)是依赖于OS的实现。
See Wikipedia exit(N)
系统调用或等效函数返回的值。
Wikipedia。像函数一样的waitpid通常返回前一点的退出状态,但它依赖于OS实现。 (ofc,现在由POSIX标准化)。回到历史:
在Multics之后,UNIX得到了开发。 From this page
我们所知道的waitpid
有两个前辈:
如果有兴趣,请通过手册阅读 - 链接为here。
第一次提到"退出代码"在里面 Manual of the PWB (aka Mashey) Shell。 所有贝壳"之前"仅讨论:
终止报告
如果命令(未跟随"&")异常终止, 打印一条消息。 (退出以外的所有终止 和中断被认为是异常。)
所以,问题的答案在上面一行 - 符合评论中已经说过的内容:
$ r是上一个命令的退出状态代码。 ``0''是大多数命令的正常回报。
请注意:最字词。 :),例如它并非发明在"片刻"由某人,但它是在时间进化。它非常依赖于底层操作系统中shell
和exit
调用的实现。
例如,UNIX的第一个版本对wait-like
级别一无所知 - 这是一个简单的exit(N)
而exit()
没有返回特定值 - {{3 } from
退出是终止流程的常用方法。所有文件都是 如果正在执行等待,则会通知父进程。
等待会导致其调用者延迟,直到其子进程之一终止。如果任何孩子已经死亡,立即返回;如果 没有子节点,返回是立即设置的错误位。
另外,The first edition of the Unix Programmer's Manual, dated November 3, 1971 - 关于wait
,fork
,exec
和exit
......
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。 ;)
答案 1 :(得分:-1)
在大多数处理器中,处理器状态指示最后一条指令是否产生零值。如果没有明确地与零比较(保存指令周期),则可以分支零(或非零)。如果取得成功,则会提供多种方法来返回失败(并保存指令)。
这实际上是一个非常糟糕的惯例。 70年代的VMS操作系统比目前使用的几乎所有系统都更加先进。它有一个集中的错误系统,应用程序可以在其中添加自己的错误消息和代码,这些消息和代码将与系统错误代码集成。在VMS系统中,奇数值是成功的,甚至值都是失败。
假设您有一个打开文件的功能。您可以拥有一个成功代码,表示它打开了一个现有文件,另一个代表它创建了一个新文件。