我使用的系统中的脚本利用set -e
:
#!/bin/sh
set -e
echo 1
true
echo 2
true
echo 3
false
echo notreached
如果我这样做:
#!/bin/sh
set -e
echo 1
true
echo 2
true
echo 3
! false
echo reached
...已到达最后一行。但是,如果我这样做:
#!/bin/sh
set -e
echo 1
true
echo 2
true
echo 3
! true
echo reached
! true
...即使应该到达最后一行false
。
更多测试:
user@linux:~$ ! false && echo ok
ok
user@linux:~$ ! true && echo ok
user@linux:~$
...所以在这些情况下,!
操作员可以正常工作。
但是,它不能与 一起正常工作set -e
。为什么?
有关的:http://mywiki.wooledge.org/BashFAQ/105...尽管这并没有回答我的问题。
答案1
因为标准是这么说的:
-e
当此选项打开时,当任何命令失败时,shell 应立即退出,[...],但以下情况除外:
- 当执行 while、until、if 或 elif 保留字后面的复合列表时,应忽略 -e 设置,以 ! 开头的管道保留字,或 AND-OR 列表中除最后一个以外的任何命令。
http://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/V3_chap02.html#set
Bash 的手册也指出了这一点,但措辞略有不同。
我认为 BashFAQ 中的条目甚至没有试图阐明具体细节,“这些规则非常复杂”这句话已经很清楚了。尽管链接的页面似乎有不止一个人想知道的内容。