Answers:
这种模式的原因是Debian软件包中的维护者脚本倾向于以开头set -e
,这会导致shell以任何非零状态退出的命令(严格来说,管道,列表或复合命令)退出。这样可以确保错误不会累积:一旦出现问题,脚本将中止。
如果允许脚本中的命令失败,则添加操作|| true
可确保生成的复合命令始终以状态零退出,因此脚本不会中止。例如,删除目录不应该是致命的错误(防止删除软件包)。所以我们会用
rmdir ... || true
因为rmdir
没有选择告诉它忽略错误。
set -e
根本没有必要|| true
,我认为提供上下文很重要。如果您在POWER上发现奇怪的地方,强烈建议您提交错误(reportbug
)!
set -e
不仅是“ Debian约定”,而且应该始终使用一种好的编程模式。看到。例如davidpashley.com/articles/writing-robust-shell-scripts
|| true
set -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
同样保证是内置的-因此甚至在遥远的现代时代都比效率更简洁)。