🔖

bashのset -euxで堅牢なシェルスクリプトを書く

2024/10/30に公開

皆さんは普段シェルスクリプトを書くとき、どのようなオプションを使用していますか?
今回は、シェルスクリプトを安全に実行するための重要なオプション set -eux について詳しく解説します。

TL;DR

シェルスクリプトの先頭に以下を追加することで、より安全な実行が可能になります:

#!/bin/bash
set -eux

各オプションの詳細

set -e (Error)

エラーが発生した時点でスクリプトを即座に停止します。

set -e
cd /path/to/non/existent/directory  # この行でエラー発生
echo "この行は実行されない"  # スクリプトは前の行で終了

デフォルトでは、エラーが発生しても処理が継続されてしまいます:

# set -e がない場合
cd /path/to/non/existent/directory  # エラーが発生しても
echo "この行が実行されてしまう"    # 処理が継続される

set -u (Undefined variable)

未定義の変数を参照した場合にエラーとして扱います。

set -u
name="Alice"
echo $name      # OK
echo $username  # Error: 未定義変数

デフォルトでは未定義変数は空文字として扱われるため、意図しない動作を引き起こす可能性があります:

# set -u がない場合
echo $undefined_variable  # 空文字として扱われる
rm -rf $undefined_variable/*  # 危険! /* として解釈される

set -x (eXecute trace)

実行されるコマンドとその引数を表示します。デバッグに非常に便利です。

set -x
name="Alice"
echo "Hello, $name"

実行結果:

+ name=Alice
+ echo 'Hello, Alice'
Hello, Alice

本番環境での使用

本番環境では、デバッグ出力は不要なため、通常は-xを外してset -euとすることをお勧めします。開発時やデバッグ時には-xを追加して使用すると効果的です。

まとめ

set -euxを使用することで:

  • バグの早期発見
  • 意図しない動作の防止
  • デバッグの容易さ
    が実現でき、より堅牢なシェルスクリプトを作成することができます。

是非、皆さんのシェルスクリプトでも活用してみてください!

Discussion