なぜ! 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
このオプションがオンの場合、次の場合を除き、コマンドが失敗したときに[...]シェルをすぐにシャットダウンする必要があります。

  1. while、Until、if、またはelifの予約語の後にある複合リストを実行するときは、-e設定を無視する必要があります。!で始まるパイプライン予約語、またはリストの最後のコマンドを除くすべてのコマンドをAND-ORします。

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

バッシュマニュアルこれも指摘されていますが、わずかに異なる用語で使用されています。

私の考えでは、BashFAQのエントリは詳細を説明しようとしていないようです。 「このルールは非常に複雑です」というフレーズが十分に明確です。リンクされたページには、一人が知りたいものよりも多くの内容があるようです。

関連情報