Claude Code の Bash ツールで発生するエラーとは
Claude Code を使った開発では、Bash ツールを通じてシェルコマンドを実行する場面が頻繁にあります。npm install、git push、python script.py などの日常的なコマンドから、ビルドやテストの実行まで、Bash ツールはあらゆる開発作業の基盤です。
しかし、次のようなエラーに遭遇して作業が止まってしまうことがあります。
- コマンドがタイムアウトして結果が返らない
Permission deniedでファイル操作やコマンド実行ができない- 出力が途中で切れて全体の結果を確認できない
ENOENT(ファイルが見つからない)でスクリプトが失敗する- 環境変数やパスが想定通り設定されない
これらの問題について原因を分析し、具体的な解決手順を順番にご紹介します。実際のエラーメッセージと対処法をセットで解説するので、問題が起きたときにすぐ参照できる構成になっています。
タイムアウトエラーの原因と解決策
症状
Bash ツールでコマンドを実行すると、一定時間後に以下のようなメッセージが表示されます。
Command timed out after 120000ms
デフォルトでは120秒(2分)でタイムアウトが発生します。ビルド処理やテストスイートなど、時間のかかるコマンドでは頻繁に遭遇する問題です。
原因
タイムアウトが発生する主な原因は3つです。
1. コマンド自体の処理時間が長い
大規模プロジェクトの npm install やフルビルド、統合テストの実行など、本質的に時間がかかる処理があります。
2. 対話的な入力待ちでブロックされている
git rebase -i や npm init(対話モード)のように、ユーザーの入力を待つコマンドは永遠に完了しません。Claude Code の Bash ツールは非対話型のため、入力待ちのコマンドは必ずタイムアウトします。
3. 無限ループやデッドロック
スクリプトのバグにより処理が無限に続くケースです。
解決手順
Step 1: タイムアウト値を延長する
Claude Code では、Bash ツールのタイムアウトを最大600秒(10分)まで設定できます。長時間のビルドやテスト実行には、明示的にタイムアウトを指定してください。
# 長時間かかるビルドコマンドの例
# タイムアウトを300秒(5分)に設定して実行
npm run build
# テストスイートを実行する場合は10分に設定
npm run test:integrationStep 2: 対話的コマンドを非対話モードに変換する
対話的なコマンドには非対話モードのオプションを使用します。
# ❌ 対話モード(タイムアウトする)
npm init
git rebase -i main
# ✅ 非対話モード(正常に完了する)
npm init -y
git rebase main # -i フラグを除去Step 3: バックグラウンド実行を活用する
完了を待つ必要がない長時間処理は、バックグラウンドで実行できます。
# バックグラウンドでビルドを実行
npm run build > /tmp/build.log 2>&1 &
BUILD_PID=$!
echo "Build started with PID: $BUILD_PID"
# 後で結果を確認
wait $BUILD_PID && echo "SUCCESS" || echo "FAILED"
cat /tmp/build.logPermission Denied エラーの原因と解決策
症状
コマンド実行時に以下のようなエラーが表示されます。
bash: ./script.sh: Permission denied
# または
EACCES: permission denied, open '/path/to/file'
# または
fatal: could not create work tree dir: Permission denied原因
Permission Denied が発生するパターンは複数あります。
1. 実行権限が付与されていないスクリプト
シェルスクリプトを直接実行する場合、実行権限(+x)が必要です。
2. ファイルシステムの書き込み制限
Claude Code のサンドボックス環境では、特定のディレクトリへの書き込みが制限されている場合があります。
3. root 権限が必要な操作
sudo が必要なシステムレベルの操作は、Claude Code の環境では基本的に実行できません。
4. ロックファイルの競合
他のプロセスがファイルをロックしている場合に発生します。
解決手順
Step 1: 実行権限を確認・付与する
# 権限を確認
ls -la script.sh
# 出力例: -rw-r--r-- 1 user group 1234 Apr 8 10:00 script.sh
# → 実行権限(x)がない
# 実行権限を付与
chmod +x script.sh
# または bash 経由で実行(権限付与不要)
bash script.shStep 2: 書き込み可能なディレクトリを使用する
# ❌ 書き込み制限のあるディレクトリ
git clone https://github.com/user/repo.git /opt/repo
# ✅ 書き込み可能なディレクトリ
git clone https://github.com/user/repo.git /tmp/repoStep 3: ロックファイルを確認・削除する
# npm のロックファイルが残っている場合
rm -f package-lock.json
rm -rf node_modules/.package-lock.json
# git のロックファイルが残っている場合
rm -f .git/index.lock出力が途切れる・切れる問題の原因と解決策
症状
コマンドの実行結果が途中で切れ、末尾が表示されません。特に、大量のログを出力するコマンドで発生します。
# 大量のログを出力するコマンド
npm install
# → 出力の途中で切れてしまい、成功/失敗が判断できない原因
1. 出力バッファの上限
Claude Code の Bash ツールは、出力のサイズに上限があります。大量のログを標準出力に流すと、途中で切り捨てられます。
2. 標準エラー出力との混在
標準出力(stdout)と標準エラー出力(stderr)が混在すると、重要なエラーメッセージが見えなくなることがあります。
解決手順
Step 1: 出力をファイルにリダイレクトする
# 全出力をファイルに保存し、最後の部分だけ確認
npm install > /tmp/npm-output.log 2>&1
echo "Exit code: $?"
tail -20 /tmp/npm-output.logStep 2: 必要な部分だけフィルタリングする
# エラー行だけ抽出
npm run build 2>&1 | grep -E "error|Error|ERROR|failed|Failed" | tail -20
# テスト結果のサマリーだけ取得
npm test 2>&1 | tail -30Step 3: 冗長な出力を抑制する
# npm の出力を最小限にする
npm install --silent
# または
npm install --loglevel=error
# pip の出力を抑制する
pip install package-name --quiet --break-system-packagesENOENT(ファイルが見つからない)エラーの原因と解決策
症状
Error: ENOENT: no such file or directory, open '/path/to/file'
# または
bash: node: command not found
# または
/usr/bin/env: 'python3': No such file or directory原因
1. カレントディレクトリの不一致
Claude Code の Bash ツールでは、シェルの状態(カレントディレクトリ含む)がコマンド間でリセットされることがあります。前のコマンドで cd したディレクトリが、次のコマンドでは反映されない場合があります。
2. パスの指定ミス
相対パスを使った場合に、予期しないディレクトリを基準にしてしまう問題です。
3. コマンド・パッケージの未インストール
グローバルにインストールされていないコマンドを呼び出そうとした場合です。
解決手順
Step 1: 絶対パスを使用する
# ❌ 相対パスは基準ディレクトリがずれるリスクあり
cd project && node scripts/build.js
# ✅ 絶対パスなら確実
node /tmp/repos/project/scripts/build.js
# ✅ または cd と実行を1行にチェーンする
cd /tmp/repos/project && node scripts/build.jsStep 2: ファイルの存在を確認してから操作する
# ファイルの存在確認
FILE="/tmp/repos/project/package.json"
if [ -f "$FILE" ]; then
echo "File exists"
cat "$FILE" | head -5
else
echo "File not found: $FILE"
# 親ディレクトリの内容を確認
ls -la "$(dirname "$FILE")"
fiStep 3: コマンドのパスを確認する
# コマンドの所在を確認
which node
which python3
which npm
# パスを確認
echo $PATH
# npx 経由で実行(ローカルインストールのみでOK)
npx tsc --version環境変数が反映されないエラーの原因と解決策
症状
# 環境変数を設定したはずなのに空になる
echo $MY_API_KEY
# → (空)
# または .env ファイルの値が読み込まれない
node -e "console.log(process.env.DATABASE_URL)"
# → undefined原因
Claude Code の Bash ツールでは、各コマンド実行がそれぞれ独立したシェルセッションで動作します。そのため、あるコマンドで export した環境変数は、次のコマンドには引き継がれません。
解決手順
Step 1: 同一コマンド内で環境変数を設定・使用する
# ❌ 別々のコマンドでは引き継がれない
# コマンド1: export MY_VAR="hello"
# コマンド2: echo $MY_VAR → 空
# ✅ 1つのコマンド内で完結させる
export MY_VAR="hello" && echo $MY_VAR
# ✅ インライン環境変数
MY_VAR="hello" node -e "console.log(process.env.MY_VAR)"Step 2: .env ファイルを明示的にロードする
# .env ファイルの値を現在のシェルに読み込む
set -a && source .env && set +a && node server.js
# または dotenv を使用(Node.js の場合)
node -r dotenv/config server.jsStep 3: 設定ファイルに永続化する
繰り返し使う環境変数は、プロジェクトの設定ファイルに記述しておくのが確実です。
# .env ファイルに記述
echo 'DATABASE_URL=postgresql://localhost/mydb' >> .env
echo 'NODE_ENV=development' >> .env
# package.json の scripts で環境変数を設定
# "scripts": {
# "dev": "NODE_ENV=development node server.js"
# }確認方法 — エラーが解決できたか検証する
問題を修正したあとは、以下の手順で解決を確認してください。
# 1. 基本的なコマンド実行テスト
echo "Hello from Bash tool" && echo "Exit code: $?"
# 2. ファイル操作の権限テスト
touch /tmp/test-permission.txt && echo "Write OK" && rm /tmp/test-permission.txt
# 3. Node.js / Python の実行テスト
node -e "console.log('Node.js OK:', process.version)"
python3 -c "import sys; print(f'Python OK: {sys.version}')"
# 4. ネットワーク接続テスト
curl -s -o /dev/null -w "%{http_code}" https://api.anthropic.com/v1/messages
# → 401 が返ればネットワーク接続は正常(認証エラーは接続できている証拠)
# 5. git 操作テスト
cd /tmp && git init test-repo && cd test-repo && echo "test" > test.txt && git add . && git commit -m "test" && echo "Git OK" && rm -rf /tmp/test-repoすべてのテストが正常に通れば、Bash ツールの基本機能は問題なく動作しています。
予防策 — Bash ツールのエラーを未然に防ぐベストプラクティス
日常的に以下の習慣を取り入れることで、Bash ツールのエラーを大幅に減らせます。
1. 常に絶対パスを使う
相対パスに依存せず、プロジェクトディレクトリの絶対パスを変数に格納して使いましょう。
WORK="/tmp/repos/my-project"
cd "$WORK" && npm run build2. コマンドチェーンで cd と操作を結合する
# cd と実行を && で繋ぐ
cd /tmp/repos/my-project && npm test3. エラーハンドリングを組み込む
# set -e でエラー時に即停止
set -e
cd /tmp/repos/my-project
npm install
npm run build
echo "All steps completed successfully"4. 出力を適切に管理する
大量のログが予想されるコマンドは、最初からリダイレクトとフィルタリングを組み合わせましょう。
5. 対話的コマンドを避ける
Claude Code 環境では -y フラグや --non-interactive オプションを常に使用してください。
全体を振り返って
Claude Code の Bash ツール実行エラーは、原因を理解すれば確実に解決できます。この記事で取り上げたエラーパターンと対処法を整理すると、次のようになります。
- タイムアウト: タイムアウト値の延長、非対話モードの使用、バックグラウンド実行
- Permission Denied: 実行権限の付与、書き込み可能ディレクトリの使用、ロックファイルの削除
- 出力切れ: ファイルへのリダイレクト、フィルタリング、冗長出力の抑制
- ENOENT: 絶対パスの使用、存在確認、コマンドパスの確認
- 環境変数: 同一コマンド内での設定、.env ファイルの明示的なロード
エラーに遭遇したら、まずエラーメッセージを正確に読み取り、この記事の該当セクションを参照してください。多くの場合、数分で問題を解決できるはずです。
関連する記事も参考にしてみてください。
- Claude Code settings.json 完全ガイド — 設定ファイルの詳細なカスタマイズ方法
- Claude Code が動かない時の完全チェックリスト — より広範なトラブルシューティング
- Claude Code セットアップのつまずきポイント FAQ — 初期設定で困った場合の対処法