私が使用しているシステムのスクリプトは以下を利用します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
このオプションがオンの場合、次の場合を除き、コマンドが失敗したときに[...]シェルをすぐにシャットダウンする必要があります。
- while、Until、if、またはelifの予約語の後にある複合リストを実行するときは、-e設定を無視する必要があります。!で始まるパイプライン予約語、またはリストの最後のコマンドを除くすべてのコマンドをAND-ORします。
http://pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/V3_chap02.html#set
バッシュマニュアルこれも指摘されていますが、わずかに異なる用語で使用されています。
私の考えでは、BashFAQのエントリは詳細を説明しようとしていないようです。 「このルールは非常に複雑です」というフレーズが十分に明確です。リンクされたページには、一人が知りたいものよりも多くの内容があるようです。