exitコマンドの終了コード


どんな環境でもそうですが、何も意識せずにコードを書いていると、思わぬところで引っかかることがあります。

シェルスクリプトとexitコマンド

プログラムを書く上で、「途中脱出」という技法はよく必要となります。そして、シェルスクリプトでそれを実現するのがexitコマンドです。

exit 0のように終了コードを指定すれば、それをシェルスクリプト全体の終了コードとする1、という結果になります。

終了コードを指定しないと…

では、終了コードを指定しない場合はどうなるかというと、「前のコマンドの終了コードをそのまま返す」ような挙動となります。set -eしている場合2などは典型的ですが、普通に実行していれば終了コード0のコマンドばかりが並びますので、exitだけでも終了コード0を返す状況が多いです。

とはいえ、引っかかるパターンもありまして、[ 条件 ] || exitのように書くと、条件が成立しない場合に[コマンドの終了コードは1で、続くexitがその1を返してしまいます。シェルスクリプトの終了コードを0にするには、明示的に[ 条件 ] || exit 0と書く必要があります。

結論

  • exitのような、一見単純に見えるコマンドでも、意外な挙動が潜んでいることがある
  • 正常終了させたいときに、無意識にexitだけ書いていると失敗することがある

外部リンク


  1. POSIXで動作が保証されるのは0以上255以下までです。 

  2. set -eをかけている途中にエラーとなると、まさしくexit(引数なし)が実行されたのと同じ結果となる、とのことです。