質問: 次のようなスクリプトを書きました。 ``` #!/bin/sh set -e hoge() { false echo "I don't want to see this message." } hoge && \ echo "... Nor this Message" ``` `-e` のオプションをセットしているので、何も表示されないだろうと期待していました。具体的には、 1. hoge 関数は、最初のコマンドが `false` なので、 set `-e` の効果によりエラー exit する。 2. hoge コマンドがエラー終了したので、 && の後半は実行されない。 もしくは、 最初の false を実行した時点でそもそも exit する。 しかし、出力は次の通りになります。 ``` I don't want to see this message. ... Nor this Message ``` 一体何がどうしてこれらのメッセージは表示されているのでしょうか。
回答: Man page of BASHによると、失敗したコマンドが、 * キーワード while または until の直後のコマンドの一部である場合 * 予約語 if または elifに続く条件式の一部である場合 * && または || によるコマンドのリストの一部である場合(最後の && や || の後のコマンドを除く) * パイプラインの中の最後のコマンド以外である * コマンドの返り値が ! で反転されている場合 のいずれかであれば、シェルは終了しない、という事です。 質問の例ですと`false`は関数中では単独で呼び出されていますが、その関数を呼び出しているのは`&&`を含んだコマンド列ですので、 > > && または || によるコマンドのリストの一部 > > > という事になるのだと思います。