esm アジャイル事業部 開発者ブログ

永和システムマネジメントアジャイル事業部の開発者ブログです。

`set -e` で、コマンドが失敗したときシェルスクリプトの実行を中断する

シェルスクリプトで途中のコマンドが失敗したら直ちに実行を中断してほしいことがあります。 事前に set -e しておけば、コマンドが失敗したとき (non-zero で終了したとき) にスクリプト自体が異常終了します。

#!/bin/sh

set -e

false     # ここで中断される

echo ':(' # 実行されては困る処理

sh や bash-e を同じように解釈するので、#!/bin/sh -e というように shebang に書くこともできます。 反対に set -o errexit というやや冗長な書き方もあります。

次のような箇所では、コマンドが non-zero を返してもスクリプトは終了しません。

  • パイプラインの途中 (最後のコマンドは除く)。
  • whileuntil if elif の条件式。
  • 複数の式を expr1 && expr2 のように AND や OR でつないだ式。

bash の pipefail オプションを使えばパイプラインで失敗したときにも終了できます。

#!/bin/bash -eo pipefail

false | true # ここで中断される

echo ':('    # 実行されては困る処理