シェルスクリプト内のコマンドがエラーになったとき処理を中断させる方法

シェルスクリプトは普通、途中のコマンドでエラーが発生しても止まることなく、次のコマンドを実行します。たとえば、以下のようなシェルスクリプト「test.sh」を作成してみます。

#!/bin/sh
ls sonzai_shinai_fairu
echo 'test'

sonzai_shinai_fairu」は存在しないものとします。実行すると、以下のように出力されます。

$ sh test.sh
ls: 'sonzai_shinai_fairu' にアクセスできません: そのようなファイルやディレクトリはありません
test

2行目の「ls sonzai_shinai_fairu」はエラーを起こしましたが、そのまま次の「echo 'test'」が実行されています。
しかし、途中のコマンドでエラーが発生したとき、処理を中断させたいことがあります。そのような場合は、以下のように「set -e」を実行するようにします。以下を「test2.sh」として保存します。

#!/bin/sh
set -e
ls sonzai_shinai_fairu
echo 'test'

これを実行すると、以下のように出力が変わります。

$ sh test2.sh
ls: 'sonzai_shinai_fairu' にアクセスできません: そのようなファイルやディレクトリはありません

最後の「test」という出力が無くなりました。これは、「ls sonzai_shinai_fairu」が失敗した(=リターンゴードが0以外を返した)ので、そこでシェルスクリプトが中断されたためです。そのため、「echo 'test'」は実行されませんでした。

この「-e」は、「sh」や「bash」といったコマンドのオプションとして設定することもできます。「set -e」を含まない「test.sh」を以下のように実行したとします。

$ sh -e test.sh
ls: 'sonzai_shinai_fairu' にアクセスできません: そのようなファイルやディレクトリはありません

このように、「sh test2.sh」を実行した時と同じようにエラーでスクリプトが中断され、「test」は出力されません。

また、一行目を「#!/bin/sh -e」と書くこともできます。以下の内容で「test3.sh」を作成したとします。

#!/bin/sh -e
ls sonzai_shinai_fairu
echo 'test'

chmodで実行フラグをオンにします。

chmod +x test3.sh

そして、「./test3.sh」で実行します。

$ ./test3.sh 
ls: 'sonzai_shinai_fairu' にアクセスできません: そのようなファイルやディレクトリはありません

この通り「test」が出力されず、エラーによりスクリプトが中断されたことが分かります。

ただし、スクリプトを直接実行しないと「-e」は有効になりません。
以下のように「sh test3.sh」と実行すれば、「test」が出力されます。

sh test3.sh
ls: 'sonzai_shinai_fairu' にアクセスできません: そのようなファイルやディレクトリはありません
test