使用trap
可能有助于编写最干净的bash脚本。 不过,我想知道,以是否存在陷阱的解决方案在以下情况下的错误:Linux陷阱最佳实践&&
GNU的bash,版本4.2.45
情况确定
#!/bin/bash
trap 'echo OK i see error at line $LINENO;exit' ERR
unknowncommand
echo "test KO should never reach me"
情况下KO
#!/bin/bash
trap 'echo OK i see error at line $LINENO;exit' ERR
unknowncommand && echo "miss the trap"
echo "test KO should never reach me"
- 不幸的是,我们到达最后一句,好像
&&
使整个句子不是一个ERR。
http://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html如果管道[...]返回非零状态,立即退出。如果失败的命令是命令列表的一部分,紧接着关键字,if语句中的测试的一部分,在&&或||中执行的任何命令的一部分,shell不会退出。列表,除了最后的&&或||之后的命令,管道中的最后一个命令或命令的返回状态与!相反的列表。 – chris
更多相关的(但基本上相同的想法)是'trap'内建文档中'ERR'伪信号的描述。 – chepner
@chris令人困惑,但准确。 Bash似乎将布尔解释为命令列表,即使不使用大括号来形成列表表达式。虽然我的回答是正确的,但是你指向'-e'的指针有助于解释Bash如何解析表达式。 –