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パイプライン、システム状態を変更するすべてのスクリプトにとって重要です。適切なエラーハンドリングなしでは、失敗したデータベースマイグレーションがシステムを不整合な状態に残したり、失敗したバックアップが気づかれずに済む可能性があります。

試してみる — Bash Cheat Sheet

フルツールを開く