Bash スクリプトでの set -e

Nilesh Katuwal 2023年1月30日
  1. Bash の関数本体の外で set -e を使用する
  2. Bash の関数本体内で set -e を使用する
Bash スクリプトでの set -e

コマンドがゼロ以外の終了ステータスを返す場合、set -e オプションはシェルに終了するように指示します。簡単に言うと、コマンドが失敗するとシェルは終了します。

Debian パッケージ管理スクリプトでは、set -eset -o errexit とも呼ばれます。Debian ポリシーによると、このオプションの使用は特定のスクリプトで必要です。目標は、未処理のエラーシナリオの可能性を回避することであるように思われます。

実際には、これは、実行するコマンドがエラーを返す可能性がある状況を理解し、それらの各問題に明示的に対処する必要があることを意味します。

Bash の関数本体の外で set -e を使用する

hello_world 関数を使用して Hello World を出力する Bash スクリプトを作成してみましょう。関数の外で set -e を使用します。

set -e は、エラー表示コードを記述または設定するためにのみ使用されます。

#!/bin/bash
set -e
function hello_world()
{
echo "Hello World!"
}
hello_world

出力:

Hello World!

Bash の関数本体内で set -e を使用する

ここで、上記のスクリプトの関数内に set -e を配置します。

#!/bin/bash
function hello_world()
{
set -e
echo "Hello World!"
}
hello_world

出力:

Hello World!

関数の内部または外部で set-e を使用しても、出力には影響しません。

set -etrap

set -e コマンドは、エラーを検出したときに例外をスローするように端末に指示し、コードの実行を停止させます。trap キーワードを使用すると、組み込み関数 ERR を利用できます。この関数は、エラー行番号を受け取り、それをエラー関数に渡します。

例を見てみましょう。

#!/bin/bash
set -e
function error()
{
echo "error at $1"
}
trap 'error $LINENO' ERR

errors

関数 error を作成し、シェル変数 $1 を使用して、エラーが発生した行番号を格納しました。

出力:

demo.sh: line 9: errors: command not found
error at 9

demo.sh は、上記のスクリプトを含むスクリプトファイルの名前です。

スクリプトの 1 行が失敗しても、最後の行が成功した場合、スクリプト全体が成功したと見なされます。その結果、エラーを見落としがちです。

スクリプトではエラー耐性がはるかに優れており、set -e がそれを提供します。