Claude Code のエラー

Input must be provided either through stdin or as a prompt argument when using --print

結論

--print に入力が渡っていない状態。PowerShellのパイプがBOMを注入するのが主因。

確認した版 Claude Code v2.1.259
確認日 2026年9月3日
文言の照合 Claude Code v2.1.259
最終更新 2026年9月3日
根拠 実機で確認

エラー文字列

Claude Code
Input must be provided either through stdin or as a prompt argument when using --print

何が起きているか

--print-p)モードは対話をしないため、実行時に入力が渡されている必要があります。 その入力が空だったため、処理を始められませんでした。

渡し方は2通りです。

# 1. 引数として渡す
claude -p "このリポジトリのテストを実行して"

# 2. 標準入力から渡す
echo "このリポジトリのテストを実行して" | claude -p

「パイプで渡したのに失敗する」場合、原因はシェル側にあります。 とくに Windows の PowerShell で頻発します。

直し方

1. まず引数で渡してみる

切り分けのために、パイプをやめて引数で試してください。

claude -p "テスト"

これが通るなら、問題は入力の渡し方です。 以下へ進んでください。

2. ⭐ PowerShell のパイプは BOM を注入する(Windows で最も多い原因)

PowerShell のパイプは Unix のシェルと動作が違います。「渡らない」のではなく、余計なものが付いて渡ります。

ネイティブコマンドへ実際に届いたバイト列を測った結果です(Windows PowerShell 5.1)。

渡し方 実際に届いたバイト列(ABC を渡した場合) 判定
"ABC" | prog EF BB BF 41 42 43 0D 0A 先頭に UTF-8 BOM、末尾に CRLF
cmd /c "type file | prog" 41 42 43 ✅ そのまま
引数で渡す 41 42 43 ✅ そのまま

EF BB BF は UTF-8 BOM です。 画面には何も見えませんが、プロンプトの先頭に不可視の文字が1つ入った状態でモデルに渡ります。

そして空の変数をパイプすると、届くのは EF BB BF 0D 0A だけになります。バイトとしては空ではないのに中身は無いため、Error: Input contained only whitespace として弾かれます。

3. ⚠️ エンコーディング設定を変えても直りません

よく紹介される次の対処は、このBOMには効きません。 実測で確認済みです。

試したこと 結果
$OutputEncoding を BOM なし UTF-8 にする EF BB BF が残る
[Console]::OutputEncoding を BOM なし UTF-8 にする EF BB BF が残る
両方を変更する EF BB BF が残る
$OutputEncoding = [System.Text.Encoding]::UTF8 🔴 BOM が二重になるEF BB BF EF BB BF

⚠️ 最後の書き方はよく見かけますが、逆効果です。 [System.Text.Encoding]::UTF8BOM 付きの UTF8Encoding なので、PowerShell が付ける BOM に加えてもう1つ増えます。

4. 確実に動く渡し方

方法1: 引数で渡す(推奨)

claude -p "テストを実行して"

ファイルの内容を渡す場合は、変数に受けてから引数にします。

$prompt = Get-Content prompt.txt -Raw -Encoding utf8
claude -p $prompt

⚠️ -Raw-Encoding utf8 の両方が必要です。

省くと 何が起きるか
-Raw 1行ずつの配列になり、引数がバラバラに渡る
-Encoding utf8 BOM の無い UTF-8 ファイルが CP932 として読まれ、日本語が化ける

PowerShell 5.1 は BOM がある場合だけ UTF-8 を自動判定します。BOM を消したファイルほど化けます。

方法2: cmd /c を経由する

パイプを使いたい場合は、PowerShell ではなく cmd にパイプさせます。BOM は付きません。

cmd /c "type prompt.txt | claude -p"

方法3: PowerShell 7 を使う

PowerShell 7 では既定のエンコーディング処理が変わっています。7 が使える環境なら、そちらで実行するのが簡単です。

pwsh -c 'Get-Content prompt.txt -Raw | claude -p'

5. 届いているバイト列を自分で確認する

疑わしいときは、実際に何が渡っているかを見てください。PHP でも Python でも、標準入力を16進で出せるものなら何でも構いません。

# Python がある場合
"ABC" | python -c "import sys; print(sys.stdin.buffer.read().hex())"
出力 意味
414243 ✅ そのまま届いている
efbbbf414243... ❌ 先頭に BOM が付いている
efbbbf0d0a だけ ❌ 中身が空。手前のコマンドが何も出力していない

6. 空になっていないか確認する

パイプの手前が何も出力していないと、入力は空になります。

# 手前だけ実行して中身を確認する
git diff | head
(Get-Content prompt.txt -Raw -Encoding utf8).Length

0 なら、渡すものがありません。

7. CI・スクリプトでの書き方

ヒアドキュメント(bash)

claude -p "$(cat <<'EOF'
このリポジトリの変更点をレビューして、
問題があれば指摘してください。
EOF
)"

変数経由(bash)

PROMPT=$(git diff)
claude -p "次の差分をレビューして: $PROMPT"

⚠️ 変数を引用符で囲まないと、改行や空白で分割されます。 必ず "$PROMPT" の形で使ってください。

GitHub Actions

- run: |
    claude -p "$(cat prompt.txt)"

8. 似たエラーとの区別

表示 原因
Input must be provided either through stdin or as a prompt argument when using --print 入力が渡っていない
Error: Input contained only whitespace 渡ってはいるが空白だけ
Blank prompt — the message was only whitespace, so nothing was sent to the model. 同上
--bg and --print conflict --bg--print を同時指定した。どちらかを外す

空白だけになる場合は、手前のコマンドが何も出力していないか、変数が空です。手順 4 で確認してください。

再発防止

  • PowerShell では引数で渡す。 パイプは BOM を注入するため、避けるのが最も確実です
  • Get-Content には -Raw を付ける。付けないと1行ずつの配列になり、引数がバラバラに渡ります
  • エンコーディング設定で直そうとしない。 $OutputEncoding[Console]::OutputEncoding も、この BOM には効きません。[System.Text.Encoding]::UTF8 を指定するとむしろ二重に付きます
  • パイプが必要なら cmd /c を経由するか、PowerShell 7 を使う
  • 日本語を含むファイルは BOM なし UTF-8 で保存し、読むときは -Encoding utf8 を付ける。5.1 は BOM が無いと CP932 として読みます
  • 挙動が怪しいときは、届いているバイト列を16進で確認する。BOM は目に見えません

この手順で直りませんでしたか?

環境を添えて報告いただければ、追加の原因を検証してこのページに反映します。

エラーを報告する