当我是新的shell脚本,我使用了很多简短的测试,而不是if语句,如false&&真正。
后来我学会了使用set -e,发现我的脚本由于某种原因而死亡,如果我用完整的if语句替换了短测试,它们会工作。现在,时间已经过去了,我仍然使用完整的if语句。
最有趣的是,如果我打开一个交互式shell并执行以下操作:
set -e false && true echo $?
它返回1但是shell不会死!
我看到我一直在浪费太多的代码行。任何人都可以向我解释如何安全地使用set -e与短测试,例如。没有脚本死吗?
Single UNIX Specification描述了set -e的效果:
When this option is on,if a simple command fails for any of the reasons listed in Consequences of Shell Errors or returns an exit status value >0,and is not part of the compound list following a while,until,or if keyword,and is not a part of an AND or OR list,and is not a pipeline preceded by the ! reserved word,then the shell shall immediately exit.
如您所见,AND列表中的失败命令不会使shell退出。
使用set -e
使用set -e启动shell脚本被认为是最佳实践,因为如果出现某些错误,通常会更安全地中止脚本。如果一个命令可能无害化,我通常会追加||真的
这是一个简单的例子:
#!/bin/sh set -e # [...] # remove old backup files; do not fail if none exist rm *~ *.bak || true