公式ドキュメントに載っている claude -p "..." --output-format json | jq -r '.result' を、そのまま叩いてみました。
返ってきたのは、結果ではなく jq のエラーでした。
手元の Claude Code 2.1.281 では、JSON が単体のオブジェクトではなくイベントの配列で返ってきたからです。
私は毎週日曜の朝5時に、launchd から claude -p でキーワード提案のスキルを回しています。
この記事は、その運用で使ったコマンドとオプション、実測した出力の形をまとめたものです。
CLIの基本から -p の自動化まで、1本で追えます。
この記事でわかること
- claude・-c・-r・update など、日常で使うコマンドの早見表
- --model・--allowedTools など、よく使うオプションの役割
- -p の出力形式と、JSONが配列で返る実測結果
- launchd で週次実行している実例と、ハマった点
動作確認した版は Claude Code 2.1.281(2026年10月5日)です。
オプションは版ごとに増えるので、各所に必要なバージョンを書いています。
PARTS LIST /目次
Claude Code CLIとは?ターミナルで動く本体
Claude Code CLIとは、ターミナルで claude と打って起動する、Claude Code の本体です。
VS Code拡張機能やデスクトップアプリでも、同じ Claude Code が使えます。
ただし、スクリプトやスケジュール実行に組み込みやすいのは、CLIの claude -p です。
この節では、CLIが他の環境とどう違うかを整理します。
CLI・VS Code・Desktopの違い
見た目の違いは、入力する場所だけではありません。
CLIは「コマンドとして呼べる」点が、他の環境と決定的に違います。
設定ファイルやCLAUDE.mdは、環境をまたいで共通で使われます。
CLAUDE.mdの書き方はこちらの記事、料金の考え方は料金確認の記事にまとめています。
CLIとClaude本体の違いは3製品の使い分けの記事が詳しいです。
CLIでしかできないこと
私がCLIを選んでいる理由は、1つに絞れます。
cron や launchd のような、人のいない時間帯に動かす仕組みと繋げられるからです。
たとえば週1回のキーワード提案は、エディタのパネルを開かなくても、ジョブとして動いています。
人が起きる前に終わらせたい仕事ほど、CLIの出番です。
claude人が画面を見ながら、指示と承認を繰り返す。試行錯誤や調査向き。claude -p1回の指示で最後まで走り、結果を標準出力に返して終了する。自動化向き。起動と基本コマンド|claude・-c・-r・update
日常で使うコマンドは、実は10個もありません。
公式のCLIリファレンスには claude agents や claude self-hosted-runner など多数のサブコマンドが載っています。
ただ、個人で毎日使うなら、次の表の範囲で足ります。
対話モードと-p(非対話)の違い
-p(--print)をつけると、Claude Codeは対話せずに答えを出力して終了します。
成功時の終了コードは0、失敗時は0以外です。
シェルスクリプトの if や && で、そのまま分岐に使えます。
無効なフラグを渡した場合は、実行の前にエラーが stderr に出ます。
一方、認証切れのような実行中の失敗は、stdout に結果として出力されます。
この違いが、あとで書く「ログの設計」に効いてきます。
会話を続ける-cと、選んで戻す-r
-c は、いま居るディレクトリで最後に使った会話を続けます。
-r は、セッションIDか名前を指定して戻ります。
名前は claude -n "my-feature" のように、起動時に付けておけます。
ひとつ注意があります。
対話で打った claude --continue は、claude -p で作られたセッションを飛ばします。
-p のセッションまで含めたいときは、claude -p --continue と書きます。
セッションの保存や分岐の詳しい話は、セッション再開ガイドに書きました。
claude updateとdoctorで保守する
claude update で最新版に更新できます。
特定の版が欲しいときは claude install 2.1.118 のように版を指定するか、stable や latest を渡します。
動作がおかしいときは、claude doctor が先です。
セッションを始めずに、インストールの状態と設定ファイルのエラーを読み取り専用で診断してくれます。
再インストールを考える前に、1回打つ価値があります。
よく使うオプション早見表
オプションは公式の一覧表に何十個も載っています。
全部を覚える必要はなく、私が実際に使うのは次の3グループです。
- 実行を絞る(モデル・ターン数・予算)
- 権限を決める(何を許可し、何を止めるか)
- 指示を足す(システムプロンプトの追加)
実行を絞る:--model・--max-turns・--max-budget-usd
--model は、sonnet・opus・haiku といった別名か、モデルの完全な名前で指定します。
軽い整形や要約なら haiku、設計の相談なら opus、と使い分けると無駄が減ります。
--max-turns はエージェントのターン数に上限を付けます。
上限に達するとエラーで終了します。
--max-budget-usd は、API呼び出しに使う金額の上限です。
どちらも -p のときだけ使えます。
メモ
ターン数の目安:道具を使わない短い質問は、実測で num_turns が1でした。ファイルを読んで直す作業は、道具を使うたびに増えます。
無人で回すジョブは、暴走した時の被害を先に決めておくのが基本です。
この2つは、そのための保険になります。
権限を決める:--allowedTools・--permission-mode
--allowedTools は、確認なしで実行してよいツールを指定します。
パターンも書けます。
claude -p "ステージ済みの変更を見てコミットして" \
--allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"
Bash(git diff *) の * の前の半角スペースが肝です。
スペースを抜いた Bash(git diff*) だと、git diff-index まで通ってしまいます。
--permission-mode は、セッション全体の許可の基準を決めます。
-p で使う主な値は次の3つです。
--dangerously-skip-permissions は、権限の確認をすべて飛ばします。
便利ですが、守りが外れます。
ただし、--dangerously-skip-permissions のもとでは --allowedTools などの許可ルールは効きません(公式: Allow rules have no effect in bypassPermissions)。使える道具を実際に絞るなら、--tools で指定するか、--disallowedTools で止めたいものを拒否します。
指示を足す:--append-system-prompt
Claude Code の標準の指示を残したまま、追加の指示だけ足せるのが --append-system-prompt です。
ファイルから読む --append-system-prompt-file もあります。
gh pr diff 123 | claude -p \
--append-system-prompt "あなたはセキュリティ担当です。脆弱性だけを指摘して。" \
--output-format json
--system-prompt は標準の指示ごと置き換えます。
ツールの使い方や安全面の指示まで消えるので、コード作業を任せるなら追加側が無難です。
-pで自動化する:出力形式とパイプ
-p が本領を発揮するのは、出力を別のプログラムが読むときです。
人が読むだけなら、対話モードで足りてしまいます。
ここで冒頭の話に戻ります。
公式の例どおりに jq を書いたら、動きませんでした。
出力の形を確かめるところから、順に見ていきます。
text・json・stream-jsonの使い分け
--output-format は3種類あります。
stream-json を -p で使うときは、--verbose も一緒に渡します。
トークン単位で受けたいなら --include-partial-messages を足します。
スキーマに沿った出力が欲しいときは、--json-schema を使います。
検証済みのJSONが structured_output というフィールドに入ります。
jsonの中身を実測(配列で返る点に注意)
2.1.281 で、次のコマンドを実行しました。
haiku に1ターンだけ、短いコードのバグを指摘させています。
echo "def add(a,b): return a-b" | claude -p "このコードのバグを1文で指摘して" \
--model haiku --output-format json --max-turns 1 --no-session-persistence
返ってきたのは、単体のオブジェクトではなく、8個のイベントが並んだ配列でした。
system(init と thinking_tokens)、assistant、rate_limit_event、そして最後に result が入っています。
jq -r '.result'動かなかった。Cannot index array with string "result"jq -r '.[-1].result'動いた。最後の要素の result を取り出せたresult の要素には、答えの本文のほかに、次の値が入っていました。
total_cost_usd:0.0187083(このやり取り1回分の推定コスト)num_turns:1is_error:falsesession_id:続きの会話に使えるID
コストは、MCPやスキルを多数入れた私の環境での値です。
短い質問1回でも、約0.019ドルかかりました。
金額は公式も「推定値」としているので、請求の目安に留めてください。
JSON出力の形は版によって変わりえます。スクリプトに組み込む前に、使っている版で一度 jq 'type' を実行し、オブジェクトか配列かを確認してください。
パイプで渡す・--bareで軽くする
標準入力を読めるので、他のコマンドの出力をそのまま渡せます。
cat build-error.txt | claude -p "原因を3行で説明して" > output.txt
パイプで渡せるサイズは10MBまでです。
超えるとエラー終了するので、大きなデータはファイルに書いてパスで指示します。
--bare を付けると、hooks・スキル・プラグイン・MCP・CLAUDE.md の自動検出をまとめて飛ばして、軽く起動します。
どのマシンでも同じ結果が欲しいCIには向いています。
公式は、将来 -p の既定になるとも書いています。
ただし、--bare ではサブスクリプションのログイン情報(OAuth)を読みません。
認証は ANTHROPIC_API_KEY か apiKeyHelper に限られます。
私のジョブはスキルとサブスクリプションに頼っているので、--bare は使っていません。
逆に言うと、--bare なしの -p は、プロジェクトの .claude/settings.json のフックを動かし、.mcp.json のサーバーにも繋ぎます。
信頼ダイアログは出ません。
人の目がない場所で他人のリポジトリを動かすときは、この点を覚えておいてください。
launchdで週次実行している実例
ここからは、私の環境で実際に動いているジョブの話です。
毎週日曜の5時に、キーワード提案のスキルを claude -p で起動しています。
スキルは本来、人が呼び出すものです。
それを人のいない時間に回すために、-p を使っています。
/keyword-suggest を実行上の図が全体の流れです。
-p のプロンプトに /keyword-suggest と書くだけで、スキルが展開されて走ります。
公式も、-p では「ユーザーが呼び出すスキルは /スキル名 を含めれば実行前に展開される」と説明しています。
plistに書いた引数と許可ツール
plist の ProgramArguments は、おおむね次の形です(パスは短縮しています)。
<key>ProgramArguments</key>
<array>
<string>~/.local/bin/claude</string>
<string>-p</string>
<string>/keyword-suggest を引数なしで実行し、完了したら結果を簡潔に報告してください。</string>
<string>--dangerously-skip-permissions</string>
<string>--allowedTools</string>
<string>Read Glob Grep Bash Edit Write WebSearch</string>
</array>
無人実行では、権限の確認に答えられる人がいません。
そこで --dangerously-skip-permissions を付けています。--allowedTools にも7つの道具を並べていますが、前述のとおりこの組み合わせでは許可ルールは効かないので、道具を実際に絞る役目は果たしていません。絞りたいなら --tools を使います。
ファイルの読み書きと、調査に要るBash・WebSearchだけです。
注意
権限の確認を飛ばす設定は、守りを外す設定です。専用のリポジトリで、--tools や --disallowedTools で道具を絞った上で使ってください。
stderrが空で最終実行日が分からなくなった話
運用してすぐ、ジョブの監視ダッシュボードが「長期間未実行」と警告を出しました。
実際にはジョブは毎週動いています。
原因は、claude -p が成功しても stderr に何も書かない点でした。
私の監視は、標準エラーのログファイルの更新時刻で最終実行日を判定していました。
成功が続くほど、ファイルの更新時刻が古いまま止まります。
直し方は単純でした。
plist の StandardOutPath を設定し、完了報告のテキストをログに書かせます。
実行のたびに更新時刻が進むので、誤検知が消えました。
stdout のログも残す:-p は成功時に stderr が空です。実行履歴を更新時刻で見張るなら、StandardOutPath を必ず指定します。
無人実行で事故を防ぐ3つの設定
無人で回すなら、次の3つを先に決めておきます。
- 使える道具を最小にする(権限の確認を飛ばさない実行なら
--allowedTools、飛ばす実行なら--tools) - 使える金額とターン数に
--max-budget-usd・--max-turnsで上限を付ける - 誰も答えられない確認は
--permission-prompts noneで拒否にする
3つ目は 2.1.259 以降で使えます。
確認が必要な操作を、待たずに拒否して先へ進ませる設定です。
--output-format stream-json と組み合わせると、拒否された操作が permission_denials に一覧で残ります。
私のジョブは、まだこの上限は付けていません。
金額の上限だけでも、先に入れておくほうが安心だと感じています。
CLIでつまずく改行入力の対処
CLIを使い始めて最初につまずくのが、改行です。
Enter を押すとその場で送信されてしまい、複数行の指示が書けません。
迷ったら Ctrl+J です。
どのターミナルでも、設定なしで改行できます。
長い指示を書くときは、Ctrl+G で外部エディタを開く手もあります。
プロンプトを普段使いのエディタで直せるので、長文の指示に向いています。
よくある質問
Claude Code CLIについて、読者からよく聞かれる質問をまとめました。
コマンドの使い分け、-p の出力、権限まわりの3点が中心です。
細かい手順や根拠は、各見出しの本文もあわせて確認してください。
Q1. Claude Code CLIとは何ですか?
A1. ターミナルで claude コマンドから起動する、Claude Code の本体です。VS Code拡張機能やデスクトップアプリでも同じ Claude Code が使えますが、スクリプトやスケジュール実行に組み込みやすいのはCLIです。
Q2. claude -p は対話モードと何が違いますか?
A2. 対話せずに1回の指示で最後まで実行し、結果を標準出力に返して終了します。成功時は終了コード0、失敗時は0以外なので、シェルスクリプトの分岐に使えます。
Q3. --dangerously-skip-permissions は使ってよいですか?
A3. 権限の確認をすべて飛ばすため、守りが外れます。使うなら専用のリポジトリで、--tools や --disallowedTools により使える道具を絞った上にしてください(この場合 --allowedTools は効きません)。確認に誰も答えられない実行なら、--permission-prompts none で拒否に倒す手もあります。
Q4. -p で作った会話は -c で続けられますか?
A4. 対話で打つ claude --continue は、-p のセッションを飛ばします。続けたいときは claude -p --continue、または --resume にセッションIDを渡します。IDは --output-format json の結果から取れます。
Q5. jsonの出力から結果を取り出すには?
A5. 2.1.281 の手元の環境では、JSONがイベントの配列で返りました。jq -r '.[-1].result' で最後の要素の result を取れます。公式の例の jq -r '.result' はオブジェクトを想定しているため、版によって書き方を変える必要があります。
Q6. Shift+Enterで改行できないときは?
A6. Ctrl+J なら設定なしで、どのターミナルでも改行できます。\ を打ってから Enter を押す方法も、すべてのターミナルで使えます。
まとめ:まず-pを1つ、スクリプトに入れてみる
日常で使うコマンドは claude・-c・-r・update の4つで足ります。
オプションは「実行を絞る」「権限を決める」「指示を足す」の3グループで覚えると迷いません。
-p は、出力の形を先に確かめてから組み込んでください。
私は公式の例をそのまま信じて、jq の行で最初に止まりました。
自動化を試すなら、まず読み取りだけの小さなジョブから始めるのが安全です。
許可ツールを Read と Grep に絞り、--max-turns に低い値を入れて、stdout をログに残してください。
動いたら、hooksやサブエージェントと組み合わせる段階に進めます。
最初の1本が通ると、日曜の朝に勝手に仕事が終わっている感覚を味わえます。
| REV. | DATE | 内容 |
|---|---|---|
| 3 | 2026-10-16 | 図解を描き直し(図面のデザインにそろえた) |
| 2 | 2026-10-06 | 記載内容の事実確認と修正 |
| 1 | 2026-10-05 | 初版 |

