Skip to content

脚本和 CI 里跑 Claude:-p--bare 和权限

本地聊天用交互式会话;流水线和脚本用 print 模式。一句 prompt、一次退出码,就能嵌进 bash、Make、GitHub Actions。坑在于:-p 默认并不「干净」。

最小用法

bash
claude -p "总结这个仓库的测试入口"
echo $?

-p(print)跑完就退。脚本里要看退出码:成功与模型/工具失败要分开处理,别假设「有输出就是 0」。

标准输入也能喂,有大约 10MB 上限:

bash
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

bash
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 凭证)。别指望登录态钥匙串在无跑容器里还在。

用旗标把上下文加回来

常用拼装:

bash
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;脚本里常用 acceptEditsautodontAsk 等,按风险选。Auto 分类器细节见 Auto mode 配置

输出:

  • --output-format text|json|stream-json
  • 需要结构化字段时加 --json-schema,走 structured_output,方便下游 jq

stream-json 适合边跑边解析;批处理收结果用 json 更简单。

多步脚本:--continue / --resume

单次 -p 不够时:

bash
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 指南

实操清单

  1. 脚本入口用 claude -p "...",检查退出码
  2. CI 默认加 --bare,配置 ANTHROPIC_API_KEY
  3. 需要的上下文用 --append-system-prompt / --settings / --mcp-config / --allowedTools 显式传入
  4. --permission-mode 按任务选;不要在不可信仓库上裸跑带 hooks 的 -p
  5. 输出用 jsonstream-json;结构化需求加 --json-schema
  6. 多步用 --continue / --resume;更复杂的嵌入式场景再看 Agent SDK

-p 让 Claude 进脚本;--bare 让脚本边界可控。自动化里少一点「顺手加载」,就少一类凌晨难查的钩子事故。

Claude-cn.org,专注于 Claude Code 中文教程