Input must be provided either through stdin or as a prompt argument when using --print
--print に入力が渡っていない状態。PowerShellのパイプがBOMを注入するのが主因。
エラー文字列
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]::UTF8 は BOM 付きの 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 は目に見えません