ヘッドレス実行(-p)
claude -p で Claude Code を非対話で動かす方法です。-p と組み合わせるフラグ、出力形式(text・json・stream-json)、bare モード、権限の扱い、SIGTERM と終了時の挙動、使用例をまとめています。
claude -p は、同じツール・エージェントループ・コンテキスト管理を、スクリプトや CI/CD から使うための非対話の実行方法です。プロンプトを -p(または --print)に渡し、必要な CLI のオプションを足します。Python と TypeScript のパッケージを使う、構造化出力・ツール承認のコールバック・ネイティブのメッセージオブジェクトまで含めた制御は、Agent SDK の基本を見てください。
claude -p "Find and fix the bug in auth.py" --allowedTools "Read,Edit,Bash"
- 成功すると終了コード 0、実行が失敗すると 0 以外で終わる。スクリプトが終了状態で分岐できる
- 無効なフラグは、実行の前に標準エラー出力へエラーが出る。認証がないなど、実行の内側の失敗は、結果として標準出力に出る
- 標準入力を読むので、データをパイプで渡し、応答をリダイレクトで取り出せる
- すべての CLI オプションが
-pと組み合わせられるわけではない。--bgは拒否され、タスクの説明つきの--cloudも、競合を示すエラーで拒否される(セッション ID つきの--cloudと-pは、そのクラウドのセッションにメッセージを送って終了する)
-p とよく組み合わせるフラグ#
| フラグ | 内容 |
|---|---|
--continue |
直近の会話を続ける(「会話を続ける」の節) |
--resume <ID またはパス> |
セッション ID、またはセッションの .jsonl トランスクリプトの絶対パスで、特定の会話を続ける |
--allowedTools |
指定したツールを、確認なしで使わせる(権限ルールの構文) |
--permission-mode |
セッション全体の権限モードを決める(auto・dontAsk・acceptEdits など) |
--permission-prompts none |
権限プロンプトに答える人がいないとき、プロンプトを拒否する(v2.1.259 以降) |
--output-format |
出力形式を決める(text・json・stream-json) |
--json-schema |
--output-format json と組み合わせて、JSON Schema に合う構造化出力を得る |
--verbose |
stream-json で、トークンの逐次出力などを受け取るときに併用する |
--include-partial-messages |
stream-json で、生成中のトークンを受け取る |
--bare |
フック・スキル・プラグイン・MCP サーバー・自動メモリ・CLAUDE.md の自動検出を飛ばして起動を速くする |
--append-system-prompt・--append-system-prompt-file |
既定の動作を保ったまま、システムプロンプトに指示を足す |
--system-prompt |
既定のシステムプロンプトを丸ごと置き換える |
--settings <file-or-json> |
設定を渡す |
--mcp-config <file-or-json> |
MCP サーバーを渡す |
--agents <file-or-json> |
カスタムエージェントを渡す |
--plugin-dir <path>・--plugin-url <url> |
プラグインを渡す |
--forward-subagent-text |
サブエージェントのテキストと thinking のブロックも、ストリームに出す(v2.1.211 以降) |
CLI の全フラグは、CLI のコマンドとフラグを見てください。
出力形式#
--output-format で、応答の返し方を決めます。
| 値 | 内容 |
|---|---|
text(既定) |
プレーンテキスト |
json |
結果・セッション ID・メタデータを持つ構造化 JSON |
stream-json |
リアルタイムのストリーミング用の、改行区切りの JSON |
claude -p "Summarize this project" --output-format json
jsonの応答には、total_cost_usdとモデルごとのコストの内訳が入るので、スクリプトから、使用量のダッシュボードを見ずに支出を追える。--continueや--resumeで続けた実行は、以前の実行の分を含む会話の合計を報告する。どちらもクライアント側の見積りで、実際の請求とは違うことがある- 結果のテキストは
resultフィールドに入る
構造化出力#
特定のスキーマに従う出力を得るには、--output-format json に --json-schema と JSON Schema の定義を組み合わせます。リクエストのメタデータ(セッション ID・使用量など)とともに、構造化された出力が structured_output フィールドに入ります。
claude -p "Extract the main function names from auth.py" \
--output-format json \
--json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}'
値が有効な JSON Schema でないと、claude は Error: --json-schema is not a valid JSON Schema と検証器の診断を出して終了します。"format": "email" のような format キーワードを使うスキーマは受け付けられますが、format は注釈として扱われ、強制されません。v2.1.205 より前は、無効なスキーマが黙って無視されて構造化されないテキストが返り、format を含むスキーマはすべて無効と扱われました。
ヒント
jq で応答を解析して、特定のフィールドを取り出せます。
# テキストの結果を取り出す
claude -p "Summarize this project" --output-format json | jq -r '.result'
# 構造化出力を取り出す
claude -p "Extract function names from auth.py" \
--output-format json \
--json-schema '{"type":"object","properties":{"functions":{"type":"array","items":{"type":"string"}}},"required":["functions"]}' \
| jq '.structured_output'
ストリーミング#
--output-format stream-json に、--verbose と --include-partial-messages を付けると、生成されたトークンを逐次受け取れます。各行は、1つのイベントを表す JSON オブジェクトです。ストリームの最後の行は、最終的な応答のテキスト・コスト・セッションのメタデータを持つ result メッセージです。
claude -p "Explain recursion" --output-format stream-json --verbose --include-partial-messages
受け手がストリームをゆっくり読むとき、Claude Code は、キューに残る出力が流れきるのを、残りの量に応じて最大30秒まで待ってから終了します(v2.1.214 より前は、終了の待ちが約2秒までで、大きな応答の末尾が切れることがありました)。次の例は jq で、テキストの差分だけを選んでストリーミングのテキストを表示します(-r は引用符なしの生の文字列、-j は改行なしでつなぐ)。
claude -p "Write a poem" --output-format stream-json --verbose --include-partial-messages | \
jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'
コールバックとメッセージオブジェクトによるプログラムからのストリーミングは、Agent SDK のドキュメントの「Stream responses in real-time」を見てください(SDK のセッションと入出力)。
サブエージェントのメッセージを追う#
サブエージェントのメッセージは、ストリームの中で assistant と user のメッセージとして現れ、parent_tool_use_id フィールドに、サブエージェントを起こしたツール呼び出しの ID が入ります。メインの会話のメッセージは、そのフィールドが null です。前面で動くサブエージェントの最初のメッセージは、それを動かすプロンプトを持つ user メッセージです。その最初のメッセージのあと、Claude Code は次を出力します。
- 既定:サブエージェントの
tool_useとtool_resultのブロック --forward-subagent-textまたはCLAUDE_CODE_FORWARD_SUBAGENT_TEXTを付けたとき:サブエージェントのテキストと thinking のブロックも出る。各サブエージェントのトランスクリプトを組み立て直せる(v2.1.211 以降)
どちらかを有効にすると、Claude Code は、あらゆる入れ子の深さのサブエージェントのメッセージを転送します(Agent ツールで起こしたものでも、フォークしたスキルとして始まったものでも)。フォークしたスキルが起こすサブエージェントや、サブエージェントや別のフォークしたスキルの中で始まったフォークしたスキルのメッセージには、v2.1.275 以降が必要です。入れ子のサブエージェントのメッセージは、parent_tool_use_id に、それを始めた Agent か Skill のツール呼び出しの ID が入るので、入れ子の全体を組み立て直せます。サブエージェントで動かすスキルも、ストリームに同じように現れます。フォークしたスキルの最初のメッセージは、実行を動かすスキルの内容を持つ user メッセージです。どちらかのオプションを有効にすると、フォークしたスキルのテキストと thinking のブロックもストリームに出ます(v2.1.265 より前は、フォークしたスキルの tool_use と tool_result のブロックだけが出ました)。
API のリトライを扱う#
再試行できるエラーで API のリクエストが失敗すると、Claude Code は再試行の前に system/api_retry イベントを出します。v2.1.246 以降は、apiKeyHelper の資格情報が 401 か 403 で拒否されたとき、最初の2回の再試行はイベントなしで静かに行い、3回連続の再試行からイベントを通常どおり出します(静かな再試行も attempt に数えられます)。イベントを使って、自分の画面に再試行の進み具合を出せます。
| フィールド | 型 | 内容 |
|---|---|---|
type |
"system" |
メッセージの種類 |
subtype |
"api_retry" |
再試行のイベントであることを示す |
attempt |
整数 | 現在の試行の番号(1から始まる) |
max_retries |
整数 | この失敗の原因に許される再試行の合計数。セッション全体の予算より少ないことがある |
retry_delay_ms |
整数 | 次の試行までのミリ秒 |
error_status |
整数または null | 失敗した試行の HTTP ステータスコード。API から HTTP の応答がなかった試行では null |
no_response |
オブジェクト(任意) | 失敗した試行が、時間内に応答ヘッダーを得られなかったときだけ出る。waited_ms はその試行が待った時間、retry_wait_ms は再試行が待つ時間。このイベントでは、max_retries はセッション全体の予算でなく、この原因が通常得る1回の再試行を示す(v2.1.261 以降) |
error |
文字列 | エラーの分類:authentication_failed・oauth_org_not_allowed・account_on_hold・billing_error・rate_limit・overloaded・invalid_request・model_not_found・server_error・max_output_tokens・cloud_credential_error・unknown |
uuid |
文字列 | イベントの一意の識別子 |
session_id |
文字列 | イベントが属するセッション |
セッションのメタデータを読む#
system/init イベントは、モデル・ツール・MCP サーバー・読み込まれたプラグインを含むセッションのメタデータを報告します。起動時のイベントが先に来る場合を除き、ストリームの最初のイベントです。先に来るのは次のものです。
plugin_installイベント(CLAUDE_CODE_SYNC_PLUGIN_INSTALLを設定しているとき)- 設定した
SessionStartやSetupフックが動く間のhook_started・hook_progress・hook_responseイベント。フックが出力するのに合わせて流れる。v2.1.169〜v2.1.203 では、フックの完了後にまとめて届いた(それでもsystem/initの前)。v2.1.204 でリアルタイムの配信に戻った
イベントには、この Claude Code のバージョンが実装するプロトコルの動作の名前(interrupt_receipt_v1・interrupt_cancel_queued_v1 など)を並べた、任意の capabilities の文字列の配列もあります。バージョン文字列を比べる代わりに、これで機能の有無を判定し、知らない値は無視します(v2.1.205 以降で、それより前のバージョンにはありません)。
プラグインや MCP サーバーが読み込まれなければ CI を失敗させる#
system/init イベントのプラグインのフィールドで、読み込まれなかったプラグインを検出します。
| フィールド | 型 | 内容 |
|---|---|---|
plugins |
配列 | 正常に読み込まれたプラグイン。それぞれ name と path を持つ |
plugin_errors |
配列 | プラグインの読み込み時のエラー。それぞれ plugin・type・message を持つ。満たされない依存のバージョンや、--plugin-dir の読み込み失敗(存在しないパス・無効なアーカイブなど)を含む。読み込まれなかったプラグインは plugins に出ない。エラーがなければキーは省かれる |
--plugin-dir のディレクトリやアーカイブ自体が読み込みに失敗したとき、その plugin_errors の項目には、解決された絶対パスが path として入ります。複数の --plugin-dir のうち、どれが失敗したかが分かります(path フィールドは v2.1.283 以降)。MCP サーバーのフィールドも同じように使います。
-pと--mcp-configを渡すと、Claude Code は、最初のターンの前に、まだ保留中のサーバーを、起動のタイムアウトのMCP_TIMEOUT(既定は30秒)まで待つ。キャッシュされたツール一覧を持つリモートサーバーは、待ちを飛ばし、system/initではpendingと出て、最初のツール呼び出しで接続する。待つのは v2.1.221 以降- Claude Code は、起動時に各
--mcp-configの項目を検証し、検証に失敗した項目(typeのないurlの項目など)は飛ばす。実行は続き、正常に終了するので、読み込まれなかったサーバーを見つけるにはこれらのフィールドを調べる
| フィールド | 型 | 内容 |
|---|---|---|
mcp_servers |
配列 | セッションの MCP サーバー。それぞれ name と status を持つ |
mcp_server_errors |
配列 | 設定の検証で飛ばされた --mcp-config の項目。それぞれ name・type・message を持つ。type は飛ばした理由の分類(unknown_type・url_missing_type・invalid_config・reserved_name など)で、知らない値は一般的な「飛ばした」として扱う。該当のサーバーは mcp_servers に出ない。エラーがなければキーは省かれるので、CI のゲートは、空でない配列で失敗させられる(v2.1.219 以降) |
端末で手でコマンドを動かすときは、Claude Code は Warning: 1 MCP server skipped due to invalid config: のような起動の警告を標準エラー出力に出し、飛ばした項目ごとの理由を続けます。標準エラー出力をリダイレクトしたときや、CI のランナー・SDK のホストなどのプログラムが取り込むときは、警告を出さず、飛ばした項目は mcp_server_errors フィールドだけで報告されます(警告は v2.1.219 以降)。
プラグインのインストールを追う#
CLAUDE_CODE_SYNC_PLUGIN_INSTALL を設定すると、最初のターンの前にマーケットプレイスのプラグインがインストールされる間、Claude Code は system/plugin_install イベントを出します。自分の画面にインストールの進み具合を出すのに使えます。
| フィールド | 型 | 内容 |
|---|---|---|
type |
"system" |
メッセージの種類 |
subtype |
"plugin_install" |
プラグインのインストールのイベントであることを示す |
status |
"started"・"installed"・"failed"・"completed" |
started と completed はインストール全体を括る。installed と failed は個々のマーケットプレイスを報告する |
name |
文字列(任意) | マーケットプレイス名。installed と failed に出る |
error |
文字列(任意) | 失敗のメッセージ。failed に出る |
uuid |
文字列 | イベントの一意の識別子 |
session_id |
文字列 | イベントが属するセッション |
bare モードで速く起動する#
--bare を付けると、フック・スキル・カスタムコマンド・サブエージェント・インストール済みのプラグイン・MCP サーバー・自動メモリ・CLAUDE.md の自動検出を飛ばして、起動を速くします。付けない claude -p は、作業ディレクトリや ~/.claude の設定を含め、対話セッションと同じコンテキストを読み込みます。
bare モードは、どのマシンでも同じ結果が要る CI やスクリプトで役立ちます。チームメイトの ~/.claude のフックや、プロジェクトの .mcp.json の MCP サーバーは、bare モードが読まないので動きません。--add-dir で指定したディレクトリは部分的な例外です。bare モードはその .claude/skills/ のスキルは読み込みますが、.claude/commands/ と .claude/agents/ は飛ばします。
注意
--bare なしの -p セッションは、一度も信頼していないフォルダでも、プロジェクトの .claude/settings.json のフックを動かし、.mcp.json のサーバーに接続します。-p のセッションには、ワークスペースの信頼ダイアログも、サーバーごとの承認プロンプトも出ません。-p でのリポジトリの内容の種類ごとの扱いと、それを避ける方法は権限を見てください。
次の例は、bare モードで1回きりの要約を行い、Read ツールを事前に承認して、権限プロンプトなしで呼び出しを終えます。bare モードはサブスクリプションのログインを使わないので、実行前に ANTHROPIC_API_KEY を設定してください。
claude --bare -p "Summarize README.md" --allowedTools "Read"
bare モードでは、Claude Code は OAuth の資格情報もシステムのキーチェーンも読みません。Anthropic API では、Claude Console で作ったキーを環境の ANTHROPIC_API_KEY に設定するか、--settings の JSON に apiKeyHelper を渡します。Amazon Bedrock・Google Cloud の Agent Platform・Microsoft Foundry は、通常どおり自分のプロバイダーの資格情報を読み続けます。bare モードで Claude が使えるのは、Bash・ファイルの読み取り・ファイルの編集のツールです。必要な文脈はフラグで渡します。
| 読み込むもの | 使うフラグ |
|---|---|
| システムプロンプトへの追加 | --append-system-prompt、--append-system-prompt-file |
| 設定 | --settings <file-or-json> |
| MCP サーバー | --mcp-config <file-or-json> |
| カスタムエージェント | --agents <file-or-json> |
| プラグイン | --plugin-dir <path>、--plugin-url <url> |
bare モードは、セッションの実行中の動作も制限します。
- MCP サーバー:コマンドラインで渡したサーバー(
--mcp-configなど)だけが接続する。対話セッションでも、--ideを渡さないかぎり IDE への自動接続を飛ばす - システムリマインダー:Claude は、Claude Code が通常は添えるシステムリマインダーなしで、プロンプトとツールの結果を受け取る。たとえば、以前読んだファイルがディスク上で変わっても Claude に伝わらず、
--add-dirのフォルダのスキルを含む、使えるスキルの一覧も渡らない - バックグラウンドタスク:動かない。タイムアウトに達したコマンドは、バックグラウンドへ移らず止まる
v2.1.286 より前は、これらの制限は部分的にしか効きませんでした。対話の --bare セッションは通常のセッションと同じ MCP サーバーに接続し、--bare のセッションはどれもシステムリマインダーを送り、バックグラウンドタスクも使えました。
補足
--bare は、スクリプトと SDK の呼び出しに推奨のモードで、将来のリリースで -p の既定になる予定です。CI などのスクリプト環境では、ホストのフック・プラグイン・自動メモリ・CLAUDE.md を読み込まずに起動するよう、--bare を付けてください。
権限を自動で扱う#
ツールを自動で承認する#
--allowedTools で、特定のツールを確認なしで使わせます。Read と Edit を並べると、許可を求めずにファイルを読み書きできます。Bash を並べると、シェルコマンドも同じになります。ただし、auto モードで始まる実行では、Claude Code は、素の Bash の項目を広い allow ルールとして落とし、auto モードが各コマンドを評価します。次の例は、この3つのツールを並べて、テストスイートを動かして失敗を直します。
claude -p "Run the test suite and fix any failures" \
--allowedTools "Bash,Read,Edit"
個々のツールを並べる代わりに、セッション全体の基準を決めるには、権限モードを渡します。何も権限モードを設定しない実行は、組み込みの開始時の権限モードになり、これは auto のことがあるので、欲しいものを明示します。
| 権限モード | 内容 |
|---|---|
auto |
--permission-mode auto を渡すと、分類器が、人の代わりに、ほとんどの操作を確認する |
dontAsk |
プロンプトが出るはずの呼び出しをすべて拒否する。ロックダウンした CI の実行に役立つ。Manual モードで承認が要らない操作(作業ディレクトリのファイルの読み取り・読み取り専用のコマンド群など)と、--allowedTools の項目や permissions.allow ルールが及ぶ操作は動く |
acceptEdits |
プロンプトなしでファイルを書き、mkdir・touch・mv・cp のような一般的なファイルシステムのコマンドを自動で承認する。どのモードも自動承認しない操作は変わらず適用される。読み取り専用のコマンド群を除くシェルコマンドとネットワークの要求には、--allowedTools の項目か permissions.allow ルールが要る |
claude -p "Apply the lint fixes" --permission-mode acceptEdits
--allowedTools は権限ルールの構文を使います。末尾の * が前方一致を有効にするので、Bash(git diff *) は git diff で始まるすべてのコマンドを許可します。* の前の空白は大事です。空白がない Bash(git diff*) は git diff-index にも合います。
無人の実行で権限プロンプトを切る#
スケジュールされたジョブのように、権限プロンプトに答えられる人がいないときは、--permission-prompts none を渡します(v2.1.259 以降。それより前のバージョンは、不明なオプションのエラーで拒否する)。このフラグがとくに効くのは、実行に権限のホストがあるとき、つまり canUseTool コールバックを持つ Agent SDK のアプリや、--permission-prompt-tool で渡した MCP ツールがあるときです。フラグがなければ、実行は、各権限の要求に、そのホストが答えるのを待ちます。
- フラグがあると、実行はホストに問い合わせず、待たない。プロンプトが出るはずのものは、
PermissionRequestフックが許可しない限り拒否され、Claude は、誰も承認できないので再試行しないよう伝えられて、実行は続く - ホストのない
-pの実行では、これらの要求はどちらにしても拒否されるが、フラグは、再試行しないことも Claude に伝える - 権限ルール・
PermissionRequestフック・設定した権限モードが、まずすべての呼び出しを決める。Claude Code が拒否するのは、ほかに何も決められなかった要求だけ AskUserQuestionのように人の答えが要るツールは取り除かれ、Claude は呼べない。Elicitationフックが答えない MCP の入力要求はキャンセルされる--output-format stream-jsonでは、拒否がpermission_deniedのシステムメッセージとして出て、最終的な結果のメッセージのpermission_denialsに並ぶ
claude -p "Update the dependency pins and run the tests" --permission-mode auto --permission-prompts none
使用例#
コマンドが auth.py や build-error.txt のようなファイルを挙げるところは、自分のプロジェクトのファイルに置き換えてください。
データをパイプで渡す#
非対話モードは標準入力を読みます。ほかのコマンドラインのツールと同じように、データをパイプで渡し、応答をリダイレクトで取り出せます。次の例は、ビルドのログを Claude に渡して、説明をファイルへ書きます。
cat build-error.txt | claude -p 'concisely explain the root cause of this build error' > output.txt
補足
パイプで渡す標準入力は 10MB が上限です。超えると、Claude Code は分かりやすいエラーと0以外の終了状態で終わります。大きな入力は、内容をファイルに書き、パイプの代わりにプロンプトでそのパスを参照してください。
標準入力を読めないとき(起動したプロセスが、その端を切り離したなど)は、Claude Code は標準エラー出力に警告を出し、コマンドラインのプロンプトで続けます(v2.1.211 より前は、Windows で標準入力が読めないとセッションがクラッシュするか、出力なしで静かに終了しました)。
ビルドのスクリプトに Claude を入れる#
非対話の呼び出しをスクリプトで包むと、Claude をプロジェクト固有のリンターやレビュアーとして使えます。次の package.json のスクリプトは、main との差分を Claude にパイプで渡し、タイポを報告させます。差分をパイプで渡せば、Claude にそれを読む Bash の権限が要りません。エスケープした二重引用符は、スクリプトを Windows でも動かせるようにします。
{
"scripts": {
"lint:claude": "git diff main | claude -p \"you are a typo linter. for each typo in this diff, report filename:line on one line and the issue on the next. return nothing else.\""
}
}
npm run lint:claude で実行します。
コミットを作る#
次の例は、ステージ済みの変更を見て、適切なメッセージでコミットを作ります。
claude -p "Look at my staged changes and create an appropriate commit" \
--allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"
補足
-p モードではコマンドの対応が違います。
- ユーザーが呼び出すスキルとカスタムコマンドは動く。プロンプトの文字列に
/skill-nameを入れると、Claude Code が実行前に展開する /loginのように、ターミナルの画面でだけ動く組み込みコマンドは使えない/model・/effort・/fast・/color・/renameは、/model sonnetのように値を引数で受け取り、引数なしの/mcpはサーバーの状態のテキストの要約を出す。これらの形には v2.1.205 以降が必要で、各コマンドの利用の注記に従う- 設定を変えるには、
/config thinking=falseのように、/configにkey=valueを渡す /output-style <style>で出力スタイルを切り替え、/output-styleだけで一覧する(v2.1.269 以降)
システムプロンプトをカスタマイズする#
--append-system-prompt で、Claude Code の既定の動作を保ったまま指示を足します。次の例は、PR の差分を Claude にパイプで渡し、セキュリティの脆弱性をレビューするよう指示します。たとえば review.sh というシェルスクリプトとして保存します。
gh pr diff "$1" | claude -p \
--append-system-prompt "You are a security engineer. Review for vulnerabilities." \
--output-format json
スクリプトの "$1" は、コマンドラインで渡す最初の引数です。bash review.sh 123 を実行すると、シェルが "$1" を 123 に置き換え、スクリプトは PR 123 の差分を取ります。Claude Code は、レビューを JSON で出力し、テキストは result フィールドに入ります。既定のプロンプトを丸ごと置き換える --system-prompt を含む、そのほかのオプションは、CLI のコマンドとフラグのシステムプロンプトのフラグを見てください。
会話を続ける#
直近の会話を続けるには --continue、特定の会話を続けるにはセッション ID つきの --resume を使います。v2.1.257 以降は、--continue を渡すと、Claude Code は、終わったバックグラウンドセッションは開きますが、まだ動いているものは開きません。次の例は、レビューを実行してから、続きのプロンプトを送ります。
# 最初のリクエスト
claude -p "Review this codebase for performance issues"
# 直近の会話を続ける
claude -p "Now focus on the database queries" --continue
claude -p "Generate a summary of all issues found" --continue
複数の会話を動かすときは、セッション ID を取っておいて、特定のものを再開します。
session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')
claude -p "Continue that review" --resume "$session_id"
2つのコマンドは別のディレクトリから実行できます。Claude Code は、このマシンのどのプロジェクトからでも、ID でセッションを見つけます。v2.1.223 より前は、現在のプロジェクトのディレクトリとその git worktree の中だけで ID を探したので、同じディレクトリから両方を実行する必要がありました。セッション ID の代わりに、セッションの .jsonl のトランスクリプトファイルの絶対パスを --resume に渡すと、そのファイルに保存された会話が続けられます。
終了時の動作#
終了時のバックグラウンドタスク#
claude -p の実行中に、Claude がバックグラウンドの Bash タスク(開発サーバーや watch ビルドなど)を始めると、Claude が最終的な結果を返し、標準入力が閉じてから約5秒後に、そのシェルは終了されます。猶予の間に、結果の直後に終わるタスクも出力を届けられます。
- Claude がバックグラウンドのサブエージェントやワークフローを始めると、
claude -pは、その結果が最終出力の一部なので、作業が終わるまで開いたままになる - 待ちは、既定では連続したアイドルの待ちが10分で終わるので、止まったサブエージェントやワークフローがプロセスを無期限に開いたままにしない。そのとき Claude Code は、まだ動いているものを止め、部分的な結果を捨てる。上限を変えるには
CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MSを設定し、0にすると上限なしで待つ claude -pの実行中に、Claude が Monitor の監視を始めると、Claude Code は、監視がタイムアウトするか、10分の上限で待ちが終わるか、早いほうまで待つ。待つ間、Claude は監視が報告する内容に応答し続ける。既定では、監視は Claude が始めて5分でタイムアウトする
SIGTERM で実行を止める#
kill やプロセスの監視ツールなどで、claude -p の実行を SIGTERM で止めると、Claude Code は終了コード 143 で終わります。進行中のターンは未完のままで、結果は記録されません。代わりにターンを終わらせるには、プロセスを止める前に、SIGINT を送るか、Agent SDK の interrupt() を呼びます。
SIGTERM を受けると、Claude Code は、まだ動いている Bash コマンドのプロセスツリーを終了させ、SessionEnd フックを動かして終了します。終了の間、Claude Code は、新しいツール呼び出しも、新しいモデルのリクエストも始めず、SessionEnd 以外のフックも動かしません。シグナルが届いたとき、実行がコマンドの途中か権限プロンプトの待ちだった場合の扱いは次のとおりです。
- コマンドの実行中:Claude Code は、そのコマンドを、セッションで終了されたものとして記録する
- 権限プロンプトへの答えを待っていた:プロセスに SIGTERM を送ったなら、プロンプトは答えのないまま残る。Agent SDK でプログラムがセッションを閉じるときは、SDK がシグナルを送る前に Claude Code の入力を終わらせ、Claude Code は入力が終わるとすぐプロンプトをキャンセルする
セッションを再開すると、Claude Code は中断されたターンをそのままにし、次のプロンプトが会話を進めます。再開時に、中断されたターンを続けさせるには、CLAUDE_CODE_RESUME_INTERRUPTED_TURN=1 を設定します。
作業ディレクトリが削除されたとき#
claude -p や Agent SDK のセッションの作業ディレクトリがセッション中に削除されても、セッションは動き続けます。ディレクトリがない間にターンが始まると、Claude Code は stream-json の出力に警告メッセージを出し、シェルコマンドは、ディレクトリが再び存在するまで失敗します。
関連:Agent SDK のクイックスタート(Agent SDK の基本)、GitHub Actions と GitLab CI/CD で Agent SDK を使う方法も見てください。
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。