どんな環境でもそうですが、何も意識せずにコードを書いていると、思わぬところで引っかかることがあります。
シェルスクリプトとexitコマンド
プログラムを書く上で、「途中脱出」という技法はよく必要となります。そして、シェルスクリプトでそれを実現するのがexitコマンドです。
exit 0のように終了コードを指定すれば、それをシェルスクリプト全体の終了コードとする1、という結果になります。
終了コードを指定しないと…
では、終了コードを指定しない場合はどうなるかというと、「前のコマンドの終了コードをそのまま返す」ような挙動となります。set -eしている場合2などは典型的ですが、普通に実行していれば終了コード0のコマンドばかりが並びますので、exitだけでも終了コード0を返す状況が多いです。
とはいえ、引っかかるパターンもありまして、[ 条件 ] || exitのように書くと、条件が成立しない場合に[コマンドの終了コードは1で、続くexitがその1を返してしまいます。シェルスクリプトの終了コードを0にするには、明示的に[ 条件 ] || exit 0と書く必要があります。
結論
-
exitのような、一見単純に見えるコマンドでも、意外な挙動が潜んでいることがある - 正常終了させたいときに、無意識に
exitだけ書いていると失敗することがある