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または昇格された権限で実行されるスクリプトに不可欠です。