27868


次のようなスクリプトを書きました。

[code]

    #!/bin/sh                                                                                                                  
    
    set -e                                                                                                                     
    
    hoge() {                                                                                                                   
        false                                                                                                                  
        echo "I don't want to see this message."                                                                               
    }                                                                                                                          
    
    hoge && \                                                                                                                  
        echo "... Nor this Message"
    
[/code]

`-e` のオプションをセットしているので、何も表示されないだろうと期待していました。具体的には、

  1. hoge 関数は、最初のコマンドが `false` なので、 set `-e` の効果によりエラー exit する。
  2. hoge コマンドがエラー終了したので、 && の後半は実行されない。 もしくは、 最初の false を実行した時点でそもそも exit する。

しかし、出力は次の通りになります。

[code]

    I don't want to see this message.                                                                                          
    ... Nor this Message
    
[/code]

一体何がどうしてこれらのメッセージは表示されているのでしょうか。


CC BY-SA 3.0
2016-07-26T14:21:33.053
27866
2016-07-26T14:57:28.260
754
question
sh
関数と -e オプションを併用すると意図通りに動作しないのはなぜ？


[Man page of
BASH](https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html)によると、失敗したコマンドが、

  * キーワード while または until の直後のコマンドの一部である場合
  * 予約語 if または elifに続く条件式の一部である場合
  * && または || によるコマンドのリストの一部である場合(最後の && や || の後のコマンドを除く)
  * パイプラインの中の最後のコマンド以外である
  * コマンドの返り値が ! で反転されている場合

のいずれかであれば、シェルは終了しない、という事です。

質問の例ですと`false`は関数中では単独で呼び出されていますが、その関数を呼び出しているのは`&&`を含んだコマンド列ですので、

> && または || によるコマンドのリストの一部

という事になるのだと思います。


CC BY-SA 3.0
2016-07-26T14:57:28.260
27868
2016-07-26T14:57:28.260
3054
27866
answer