为什么 !即使对于真实的返回值,带有 set -e 的运算符也总是成功?

为什么 !即使对于真实的返回值,带有 set -e 的运算符也总是成功?

我使用的系统中的脚本利用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 应立即退出,[...],但以下情况除外:

  1. 当执行 while、until、if 或 elif 保留字后面的复合列表时,应忽略 -e 设置,以 ! 开头的管道保留字,或 AND-OR 列表中除最后一个以外的任何命令。

http://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/V3_chap02.html#set

Bash 的手册也指出了这一点,但措辞略有不同。

我认为 BashFAQ 中的条目甚至没有试图阐明具体细节,“这些规则非常复杂”这句话已经很清楚了。尽管链接的页面似乎有不止一个人想知道的内容。

相关内容