シェルスクリプトは普通、途中のコマンドでエラーが発生しても止まることなく、次のコマンドを実行します。たとえば、以下のようなシェルスクリプト「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
コメント