Answers:
这种模式的原因是Debian软件包中的维护者脚本倾向于以开头set -e,这会导致shell以任何非零状态退出的命令(严格来说,管道,列表或复合命令)退出。这样可以确保错误不会累积:一旦出现问题,脚本将中止。
如果允许脚本中的命令失败,则添加操作|| true可确保生成的复合命令始终以状态零退出,因此脚本不会中止。例如,删除目录不应该是致命的错误(防止删除软件包)。所以我们会用
rmdir ... || true
因为rmdir没有选择告诉它忽略错误。
set -e根本没有必要|| true,我认为提供上下文很重要。如果您在POWER上发现奇怪的地方,强烈建议您提交错误(reportbug)!
set -e不仅是“ Debian约定”,而且应该始终使用一种好的编程模式。看到。例如davidpashley.com/articles/writing-robust-shell-scripts
|| trueset -e是可能的上下文,并且可能是最常见的。我鞠躬这个答案!不过,从字面上看,它在任何时候都认为退出状态无关紧要并且(如您的文章链接所添加的)任何时候都很有用。我没有将退出状态用作脚本控件的一部分。我看到了实用程序(在中set -e),但不会走那么远,而是说“您编写的每个脚本都应在顶部包含set -e”。这是一种编程风格。“ ALWAYS | Every”包括自己的陷阱集-aka-绝对值:通配符解决方案ALWAYS最终会事与愿违-没有免费乘车服务。
set -e行为不一致。如果您的唯一目标是bash,以及其他相对较新的Shell驻留在/bin/sh,这对您可能并不重要,但是当您想支持旧的Shell /系统时,情况就更加细微了。
set -e行为,尽管该页面还记录了许多与今天无关的历史/古代壳。还有这两个页面,它们的使用范围较窄(搜索“ set -e”):“ lintsh”页面,autoconf的便携式shell文档->内置的限制子页面
尽管它不会影响程序的输出,但它会允许调用方继续进行,就好像一切正常,也影响了以后的逻辑一样。
改写:它掩盖了先前命令的错误状态。
michael@x071:[/usr/sbin]cat /tmp/false.sh
#!/bin/sh
false
michael@x071:[/usr/sbin]cat /tmp/true.sh
#!/bin/sh
false || true
michael@x071:[/usr/sbin]sh /tmp/false.sh; echo $?
1
michael@x071:[/usr/sbin]sh /tmp/true.sh; echo $?
0
set -e和|| true公用事业将由特征和目标确定程序员
git remote remove foo || true git remote add foo http://blah-如果遥控器不存在,我们想忽略该错误。
||:是另一种惯用的写法(:是内置表中的另一个条目,指向true-但保证是内置的,甚至可以返回到Bourne;也就是说,对于POSIX sh,true同样保证是内置的-因此甚至在遥远的现代时代都比效率更简洁)。