🔖
bashのset -euxで堅牢なシェルスクリプトを書く
皆さんは普段シェルスクリプトを書くとき、どのようなオプションを使用していますか?
今回は、シェルスクリプトを安全に実行するための重要なオプション 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