SC2164: シェルスクリプトでのエラーハンドリングなしのcd

cdの失敗を適切に処理して、スクリプトが間違ったディレクトリで動作するのを防止。cd dir || exit 1やset -eを使った安全な方法を解説します。

Error Handling

詳細な説明

cdの失敗が危険な理由

cdが失敗した場合(ディレクトリが存在しない、権限がない)、スクリプトは現在のディレクトリで続行します。後続のコマンドが間違ったファイルに対して操作し、データ損失を引き起こす可能性があります。

問題

cd /app/deploy
rm -rf old_files/
# /app/deployが存在しない場合、rmは前のディレクトリで実行される!

解決策1: cd ... || exit

cd /app/deploy || { echo "/app/deployへのcdに失敗" >&2; exit 1; }
rm -rf old_files/

解決策2: set -e

set -e
cd /app/deploy  # 失敗時にスクリプトが自動的に終了
rm -rf old_files/

解決策3: サブシェル

サブシェルを使用してディレクトリ変更のスコープを限定:

(
  cd /app/deploy || exit 1
  rm -rf old_files/
)
# cdが成功しても元のディレクトリに戻る

解決策4: pushd/popd

pushd /app/deploy > /dev/null || { echo "cdに失敗" >&2; exit 1; }
rm -rf old_files/
popd > /dev/null

CDPATHの落とし穴

CDPATHが設定されている場合、cdが予期しないディレクトリに移動する可能性:

export CDPATH="/home/user"
cd projects  # /home/user/projectsに移動する可能性がある!

# 修正: 明示的なパスを使用
cd ./projects  # 常に現在のディレクトリからの相対パス

ユースケース

ビルドスクリプト、デプロイ自動化、cronジョブ、ファイル操作の前にディレクトリを変更するすべてのスクリプト。rootまたは昇格された権限で実行されるスクリプトに不可欠です。

試してみる — Shell Script Linter

フルツールを開く