Skip to content

原文(日本語に翻訳)

バックスラッシュ+改行による継続行(例:\ を使って複数行に分割された長いコマンド)を含むbashコマンドが不正な空引数を生成し、コマンド実行が壊れる可能性があった問題を修正しました。

原文(英語)

Fixed an issue where bash commands with backslash-newline continuation lines (e.g., long commands split across multiple lines with \) would produce spurious empty arguments, potentially breaking command execution.

概要

bashコマンドをバックスラッシュ(\)で改行して複数行に分割して記述した際、不正な空の引数が生成されてコマンドが誤動作する問題が修正されました。長いコマンドを可読性のために複数行に分割する際に発生していたバグで、修正後は正しく単一のコマンドとして解釈されます。特にCIスクリプトやMakefileスタイルのコマンドを多用する環境で効果的です。

基本的な使い方

bash
# バックスラッシュ改行継続を使った長いコマンドの例
curl \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"key": "value"}' \
  https://api.example.com/endpoint

# 修正前: curl に空引数が渡されてエラーになる場合があった
# 修正後: 正しく1つのcurlコマンドとして実行される

実践例

ユースケース1: 長いdockerコマンドの実行

複数オプションを持つdockerコマンドを複数行で記述する場合。

bash
# Docker build コマンドの複数行記述
docker build \
  --no-cache \
  --build-arg NODE_VERSION=20 \
  --build-arg APP_ENV=production \
  --tag myapp:latest \
  --file ./Dockerfile.prod \
  .

# 修正前: --no-cache の後に空引数が挿入され、
#          docker が引数エラーを出す場合があった
# 修正後: すべてのオプションが正しく渡される

ユースケース2: 複数行のgitコマンド

git コマンドを複数行に分けて記述する場合。

bash
# git log の複数行コマンド
git log \
  --oneline \
  --graph \
  --decorate \
  --all \
  --since="2 weeks ago"

# git archive コマンド
git archive \
  --format=tar.gz \
  --prefix=myproject/ \
  --output=myproject-v1.0.tar.gz \
  v1.0

# 修正後はどちらも正しく実行される

ユースケース3: 複雑なnpmスクリプト実行

npmやyarnのコマンドを複数行で実行する場合。

bash
# 複雑なnpmコマンドの実行
npm run build \
  -- \
  --mode production \
  --output-path ./dist \
  --optimization-minimize

# または yarn の場合
yarn jest \
  --coverage \
  --testPathPattern="src/__tests__" \
  --reporters=default \
  --reporters=jest-junit

# 修正後は空引数が挿入されずに正確に実行される

注意点

  • この修正は、バックスラッシュ+改行(\ + 改行)のコマンド継続記法に特有の問題でした
  • 継続行の \ の直後にスペースがある場合(\ + 改行)は従来から問題が発生しやすいため、\ の直後を改行にする書き方を推奨します
  • ヒアドキュメント(<<EOF)や他の複数行構文には影響しません
  • 修正はClaude Codeの内部パーサーに対するものであり、システムのbash動作自体は変わりません

関連情報