如果我运行diff -q
两个文件,并且它们相同,则生成的退出代码echo $?
为0
;如果文件不同,则退出代码为1
。为什么会这样?为什么第一个是diff
成功,第二个是失败?
我使用“成功”和“失败”这两个术语是基于我对http://mywiki.wooledge.org/BashGuide/TestsAndConditionals:
- 退出状态
每个命令在终止时都会产生一个退出代码。
启动该命令的任何应用程序都会使用此退出代码来评估
一切是否正常。此退出代码就像
函数的返回值。它是一个介于 0 和 255(含)之间的整数。惯例
规定我们使用 0 表示成功,使用任何其他数字表示
某种失败。具体数字完全取决于具体应用,
并用来暗示到底出了什么问题。
我应该读到man diff
最后,那里开发人员使用的约定很明确。
答案1
从man diff
:
如果输入相同则退出状态为 0,如果不同则退出状态为 1,如果有问题则退出状态为 2。
我坦然承认这可能不是完全标准但退出代码更多的是所谓的“指导方针”,而不是实际的规则。
在这种情况下,偏离标准可以让你轻松地diff
在脚本中运行。
diff a b && echo "no difference" || echo "differences!"
这类似于grep
如果找到某物则退出 0,如果未找到某物则退出 1。我无法解释 0 和 1 之间的方向diff
。我猜他们采用了 C 标准布尔结果。
这其实并不重要。这只是一个任意数字。
答案2
man diff
告诉我们
退出状态
The following exit values shall be returned:
0 No differences were found.
1 Differences were found.
>1 An error occurred.
将退出值称为“成功”和“失败”是一种自我限制的选择。程序有整整 8 位退出状态,值从 0 到 255。