Bashのエラーハンドリング - set -e、trap、終了コード、リトライパターン
set -euo pipefail、クリーンアップのためのtrap、終了コードの確認、リトライロジック、エラーレポートパターンによるbashスクリプトの堅牢なエラーハンドリングを学びます。
Error Handling
詳細な説明
Bashでのエラーハンドリング
Bashスクリプトはデフォルトでは静かに失敗します。適切なエラーハンドリングなしでは、失敗したコマンドが不正なデータまたは予期しない状態で後続のコマンドを実行させる可能性があります。
set -euo pipefail
set -euo pipefail
# -e:コマンドが非ゼロの終了コードを返したら即座に終了
# -u:未設定の変数への参照をエラーとして扱う
# -o pipefail:パイプ内のいずれかのコマンドが失敗したらパイプライン全体が失敗
クリーンアップのためのtrap
cleanup() {
echo "クリーンアップ中..."
rm -rf "$TEMP_DIR"
}
trap cleanup EXIT
trap 'echo "中断されました"; exit 1' INT TERM
リトライパターン
retry() {
local max_attempts="$1"
local delay="$2"
shift 2
local cmd="$@"
local attempt=1
while [ $attempt -le $max_attempts ]; do
if eval "$cmd"; then
return 0
fi
echo "試行 $attempt/$max_attempts 失敗。${delay}秒後にリトライ..."
sleep "$delay"
attempt=$((attempt + 1))
done
return 1
}
ユースケース
エラーハンドリングは本番デプロイスクリプト、バックアップの自動化、CI/CDパイプライン、システム状態を変更するすべてのスクリプトにとって重要です。適切なエラーハンドリングなしでは、失敗したデータベースマイグレーションがシステムを不整合な状態に残したり、失敗したバックアップが気づかれずに済む可能性があります。