脚本和 CI 里跑 Claude:-p、--bare 和权限
本地聊天用交互式会话;流水线和脚本用 print 模式。一句 prompt、一次退出码,就能嵌进 bash、Make、GitHub Actions。坑在于:-p 默认并不「干净」。
最小用法
claude -p "总结这个仓库的测试入口"
echo $?-p(print)跑完就退。脚本里要看退出码:成功与模型/工具失败要分开处理,别假设「有输出就是 0」。
标准输入也能喂,有大约 10MB 上限:
git diff main...HEAD | claude -p "按 diff 写简洁中文 PR 说明,分风险与测试建议"大 diff 先自己裁切,别整仓灌进去。
安全坑:没有 --bare 时仍会加载一堆东西
很多人以为 -p 等于沙箱空环境。不是。
不加 --bare 时,-p 仍然可能从当前项目和 ~/.claude 自动带上:
- Hooks
- Skills / 插件
- MCP 配置
- 自动记忆
CLAUDE.md等说明文件
而且非交互路径通常不会弹出「是否信任此目录」一类对话框。本机开发目录里随手跑的 hooks,在 CI checkout 后同样可能执行——这是权限与供应链上的真实风险。
Hooks 与说明文件的分界见 CLAUDE.md 与 Hooks;工具 allow / deny 见 权限怎么配。
CI 推荐:--bare
export ANTHROPIC_API_KEY=... # bare 不走 OAuth / 钥匙串
claude --bare -p "只根据 stdin 的 diff 做审查" < diff.txt--bare 跳过那套自动发现:不主动加载项目/用户侧的 hooks、skills、MCP、自动记忆、CLAUDE.md 等。需要什么,用旗标显式塞进去。
| 场景 | 建议 |
|---|---|
| 本机一次性脚本,信任当前仓库 | -p 可接受;仍注意 hooks |
| CI / 不可信 checkout | --bare + API Key |
| 要复用项目 MCP / 设置 | bare 下用 --mcp-config、--settings 显式传 |
认证:bare 环境依赖 ANTHROPIC_API_KEY(或你环境里等价的 API 凭证)。别指望登录态钥匙串在无跑容器里还在。
用旗标把上下文加回来
常用拼装:
claude --bare -p "按团队规范审查" \
--append-system-prompt "金额用整数分;禁止改 .env" \
--settings ./ci-settings.json \
--mcp-config ./mcp.ci.json \
--allowedTools "Read,Grep,Bash(npm test *)" \
--permission-mode acceptEdits \
--output-format json说明:
--append-system-prompt:追加系统侧说明,适合短约束--settings:传入精简 settings,避免整份开发机配置--mcp-config:只挂 CI 需要的 MCP--allowedTools:收紧工具面--permission-mode:-p默认偏 Manual;脚本里常用acceptEdits、auto、dontAsk等,按风险选。Auto 分类器细节见 Auto mode 配置
输出:
--output-format text|json|stream-json- 需要结构化字段时加
--json-schema,走 structured_output,方便下游jq
stream-json 适合边跑边解析;批处理收结果用 json 更简单。
多步脚本:--continue / --resume
单次 -p 不够时:
claude --bare -p "先列出要改的文件" --output-format json > step1.json
claude --bare -p "按上一步结果生成补丁说明" --continue
# 或 --resume <session-id>把「分析 → 再改 → 再验证」拆成可失败可重试的步骤,比一条超长 prompt 好控。远程/云端派发另一条链路,见 Remote Control 与云端派发。
Plan mode 偏交互规划;流水线里更常见的是显式 prompt + 权限模式,而不是让 CI 去按 Shift+Tab。本地大重构仍可用 Plan mode,见站内工作流相关文章。
和 Agent SDK 的关系(点到为止)
Python / TypeScript 的 Agent SDK 适合把对话、工具、权限嵌进应用代码,而不是只在 shell 里拼旗标。CI 里「跑一次审查脚本」用 -p/--bare 通常够;产品里要多轮状态机、自定义工具面,再上 SDK。本文不展开 SDK 教程。
Skills 若要在自动化里复用,bare 下需显式纳入,不要假设会从 ~/.claude 自动出现;Skills 选型见 Skills 指南。
实操清单
- 脚本入口用
claude -p "...",检查退出码 - CI 默认加
--bare,配置ANTHROPIC_API_KEY - 需要的上下文用
--append-system-prompt/--settings/--mcp-config/--allowedTools显式传入 --permission-mode按任务选;不要在不可信仓库上裸跑带 hooks 的-p- 输出用
json或stream-json;结构化需求加--json-schema - 多步用
--continue/--resume;更复杂的嵌入式场景再看 Agent SDK
-p 让 Claude 进脚本;--bare 让脚本边界可控。自动化里少一点「顺手加载」,就少一类凌晨难查的钩子事故。