K3.6.1 Task 3.6

没有 -p,你的 CI 任务会挂到超时杀死它

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 任务静默挂起直到超时杀死它们,产出最常见的集成故障。