claude -p "prompt" 是非交互式运行 Claude Code 的唯一方式。没有 -p,Claude 进入交互模式并等待终端输入。在 CI 中没有终端。进程静默挂起直到超时用退出码 137 杀死它。
这是最常见的 CI 集成故障。没有输出,没有错误消息,只是挂起。
命令模式
# 文本输出(PR 评论、日志)
claude -p "Review this PR for security vulnerabilities"
# 结构化 JSON 输出(仪表板、API)
claude -p "Extract code metrics" --output-format json
# 捕获到文件
claude -p "Analyze code quality" --output-format json > results.json
-p 处理非交互执行。--output-format json 处理结构化输出。Stdout 捕获结果。三个部分组合适用于任何 CI 集成。
诊断缺失的 -p
有这些症状的 CI 流水线几乎可以确定缺了 -p:
| 症状 | 原因 |
|---|---|
| 完全没输出 | Claude 等待交互输入 |
| 静默挂起直到超时 | CI 中没有终端 |
| 退出码 137 | 挂起后被超时杀死 |
| 本地能用、CI 失败 | 本地终端提供交互输入 |
一个团队的日志显示:7 次用 claude -p "..." 的成功运行在 30-90 秒完成,3 次用 claude "..."(没有 -p)的失败在 300 秒超时。失败从一次 CI 配置更新后开始,意外去掉了部分命令的 -p 标志。
不存在的东西
团队尝试的每一个 -p 替代品都是虚构的:
--batch标志 — 不存在。没有批处理模式。CLAUDE_HEADLESS=true— 不是真实的环境变量。CLAUDE_CI=true— 不是真实的环境变量。--no-interactive— 不是真实的标志。--stdin— 不是真实的标志。CLAUDE_OUTPUT_FORMAT=json— 不是真实的环境变量。用--output-format json。--format json— 不是正确的标志。是--output-format json。
非交互模式完全通过 -p 命令行标志控制。不是环境变量,不是 stdin 重定向,不是任何其他标志。
管道不能替代 -p
echo "analyze code" | claude > output.txt 不保证非交互模式。没有 -p,Claude 不管有没有管道输入都可能尝试交互行为。始终用显式的 -p 标志。
参数顺序
标准模式是 claude -p "prompt"。一个团队重构 CI 配置后遇到间歇性失败:
# 之前(正常)
claude -p "Review support flows" > review.txt
# 之后(间歇性失败)
claude "Review support flows" -p > review.txt
把 -p 移到 prompt 字符串后面在某些运行中导致参数解析混乱。保持 prompt 紧跟在 -p 后面。
多阶段流水线
不同 CI 阶段可以使用不同输出格式,但都共享 -p 做非交互执行:
# 阶段 1:文本用于 PR 评论
claude -p "Review code for issues" > review.txt
# 阶段 2:JSON 用于仪表板
claude -p "Extract quality metrics" --output-format json > metrics.json
两个阶段都用 -p。输出格式标志按每阶段需求变化。如果它们需要不同输出格式就不要合并成一次调用。
CLAUDE.md 自动提供 CI 上下文
CLAUDE.md 对每个 claude -p 调用加载,和交互会话一样。项目审查标准、编码规范和审查指南全部在 CI 中自动生效,不需要额外配置。这确保 CI 调用的 Claude 和开发者本地运行的 Claude 有相同上下文。
一句话总结: claude -p "prompt" 是唯一的非交互模式——没有它,CI 任务静默挂起直到超时杀死它们,产出最常见的集成故障。