原文(日本語に翻訳)
バックスラッシュ継続を含む複数行Bashコマンドが誤って分割され、パーミッションフラグが立つ問題を修正しました
原文(英語)
Fixed multi-line bash commands with backslash continuations being incorrectly split and flagged for permissions
概要
Claude Code v2.1.0で修正された、複数行コマンド解析バグです。以前のバージョンでは、バックスラッシュ(\)で継続する複数行のBashコマンドを実行しようとすると、パーミッションチェック時に各行が独立したコマンドとして誤認識され、不要なパーミッション要求が発生していました。この修正により、バックスラッシュ継続が正しく処理され、複数行にまたがる長いコマンドもスムーズに実行できるようになりました。
修正前の問題
症状
bash
claude
# 複数行にわたるdockerコマンド
> docker run \
--name myapp \
--port 8080:8080 \
myimage
# 修正前: 各行が独立したコマンドとして認識される
# ⚠️ Permission required: Execute "docker"
# Allow? yes
# ⚠️ Permission required: Execute "--name"
# ⚠️ Permission required: Execute "--port"
# ⚠️ Permission required: Execute "myimage"
# 各行ごとにパーミッションを要求される
# さらにコマンド実行失敗根本原因
入力コマンド:
docker run \
--name myapp \
--port 8080:8080 \
myimage
パーミッションチェッカーの解析(修正前):
- 行1: "docker run \" → "docker run" コマンド
- 行2: " --name myapp \" → "--name" コマンド(誤認識)
- 行3: " --port 8080:8080 \" → "--port" コマンド(誤認識)
- 行4: " myimage" → "myimage" コマンド(誤認識)
結果: 4つの独立したコマンドとして処理修正後の動作
正しい複数行解析
bash
claude
# 複数行dockerコマンド
> docker run \
--name myapp \
--port 8080:8080 \
myimage
# 修正後: 1つのコマンドとして認識
# ⚠️ Permission required: Execute "docker run --name myapp --port 8080:8080 myimage"
# Allow? yes
# ✓ 1回の承認で実行
# ✓ コマンドが正常に実行される実践例
長いcurlコマンドの整形
複雑なAPI呼び出しを読みやすく記述します。
bash
# REST APIへのPOSTリクエスト
> curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"name": "test", "value": 42}' \
https://api.example.com/v1/items
# 修正前: 各行でパーミッション要求
# 修正後: ✓ 1つのcurlコマンドとして実行複数オプションを持つgitコマンド
長いgitコマンドを整理して記述します。
bash
# リモートリポジトリのクローン
> git clone \
--depth 1 \
--branch main \
--single-branch \
https://github.com/user/repo.git \
my-project
# 修正後: ✓ 1つのコマンドとして正しく実行
# my-project ディレクトリが作成されるDocker Composeコマンドの可読性向上
複数のオプションを持つdocker-composeコマンドを整形します。
bash
# docker-compose up with options
> docker-compose \
-f docker-compose.yml \
-f docker-compose.override.yml \
up \
--build \
--remove-orphans \
-d
# 修正後: ✓ 1つのコマンドとして認識・実行スクリプト内での使用
Bashスクリプトから複数行コマンドを呼び出します。
bash
# deploy.sh
#!/bin/bash
# Claudeに実行させるコマンド
claude --prompt "
kubectl apply \
-f deployment.yaml \
-f service.yaml \
--namespace production \
--validate=true
"
# 修正後: ✓ 正常に実行されるfindコマンドの複雑な条件
複数の条件を持つfindコマンドを整理します。
bash
# 特定のファイルを検索
> find . \
-type f \
-name "*.js" \
-not -path "*/node_modules/*" \
-not -path "*/dist/*" \
-exec grep -l "TODO" {} \;
# 修正後: ✓ 1つのfindコマンドとして実行
# TODO を含む.jsファイルを検索注意点
- この修正は Claude Code v2.1.0(2026年1月7日リリース)で実装されました
- バックスラッシュ継続(Line Continuation):
- 行末の
\は「次の行に続く」を意味 - Bashは複数行を1つのコマンドとして結合
- 可読性向上のため、長いコマンドを複数行に分割
- 行末の
- 正しい使用方法:bash
# ✓ 正しい command \ --option1 value1 \ --option2 value2 # ✗ バックスラッシュの後にスペースがある(動作しない) command \ --option1 # ✗ バックスラッシュがない(別々のコマンド) command --option1 - インデント:
- 継続行はインデントして可読性を向上
- インデントは無視される(スペース/タブどちらでも可)
- 引用符との組み合わせ:bash
# 引用符内では \改行 が必要 echo "Long \ string" # または引用符を各行に echo "First line" \ "Second line" - 修正の詳細:
- Bashコマンドパーサーがバックスラッシュ継続を認識
- 複数行を1つの論理行に結合
- 結合後のコマンドでパーミッションチェック
- パフォーマンスへの影響:
- パース処理がわずかに複雑化
- 実行時のパフォーマンスは変わらず
- デバッグ:
--debugフラグでコマンド結合のログを確認- ログに「Joined multi-line command: ...」が表示される
- 関連する修正:
- index 51: コマンド置換
$()のサポート - index 53: Bashコマンドプレフィックス抽出の改善
- index 51: コマンド置換
- トラブルシューティング:
- 複数行コマンドが動作しない場合:
- バックスラッシュの直後に空白がないか確認
- 各行末に
\があるか確認 - 最終行には
\が不要
- 複数行コマンドが動作しない場合:
- シェルスクリプトとの互換性:
- Bashシェルと同じ動作
- 既存のシェルスクリプトをそのまま使用可能
- ヒアドキュメントとの併用:bash
cat << EOF \ > output.txt Content here EOF # ✓ 正常に動作