Claude Code 不只可以作为交互式终端应用,也可以像普通 Unix 工具一样读取标准输入、输出文本或 JSON,并在脚本与 CI 中运行。自动化没有人实时审查权限提示和错误方向,因此需要比交互会话更明确的工具范围、预算、输出协议、超时和隔离。

本文是系列最后一篇,介绍非交互 -p、官方推荐的 --bare、结构化输出、会话续接、模型与 Effort、成本控制,以及安装、配置、MCP、Hooks、搜索和性能问题的系统排查流程。


0. 自动化与排障速查

0.1 一次性查询

1
claude -p "概括这个项目的模块和入口"

推荐的可复现脚本模式:

1
2
claude --bare -p "只读审查当前差异" \
--allowedTools "Read,Grep,Glob,Bash(git diff *),Bash(git status *)"

0.2 JSON 输出

1
2
3
claude --bare -p "列出所有 HTTP 端点" \
--output-format json |
jq -r '.result'

0.3 JSON Schema

1
2
3
4
claude --bare -p "提取 src/routes 中的端点" \
--output-format json \
--json-schema '{"type":"object","properties":{"endpoints":{"type":"array","items":{"type":"string"}}},"required":["endpoints"]}' |
jq '.structured_output'

0.4 流式输出

1
2
3
4
claude --bare -p "审查当前差异" \
--output-format stream-json \
--verbose \
--include-partial-messages

0.5 诊断

1
2
3
4
5
claude --version
claude doctor
claude --safe-mode
claude --debug hooks
claude --debug mcp

会话内:

1
2
3
4
5
6
7
8
/doctor
/status
/context
/permissions
/hooks
/mcp
/skills
/usage

1. 交互模式与非交互模式

1.1 交互模式

1
claude

适合:

  • 需求尚未完全明确;
  • 需要人工回答问题;
  • 需要逐步审批;
  • 复杂任务要持续纠偏;
  • 需要 Plan、检查点和多轮讨论。

1.2 非交互模式

1
claude -p "分析任务"

-p--print 执行后输出并退出,适合:

  • CI;
  • 构建脚本;
  • 批量只读分析;
  • 结构化数据提取;
  • 预提交审查;
  • 由其他程序消费结果。

非交互模式跳过工作区信任对话。只能在已审查并信任的目录中运行,尤其是默认模式仍会加载项目 CLAUDE.md、Hooks、MCP 和插件。

2. --bare:脚本的推荐起点

2.1 为什么使用

1
claude --bare -p "Summarize this file" --allowedTools "Read"

官方当前文档推荐在脚本和 SDK 调用中使用 Bare mode,并说明它未来可能成为 -p 默认行为。

Bare mode 跳过:

  • Hooks;
  • LSP;
  • 插件同步;
  • Attribution;
  • Auto memory;
  • 后台预取;
  • Keychain 读取;
  • CLAUDE.md 自动发现;
  • 大部分常规定制自动发现。

优点:

  • 启动更快;
  • 不受同事 ~/.claude 私人配置影响;
  • CI 行为更可复现;
  • 减少隐式外部连接和 Hook 副作用。

2.2 显式提供需要的内容

需要 参数
追加系统提示 --append-system-prompt
从文件追加系统提示 --append-system-prompt-file
设置 --settings
MCP --mcp-config
Agent --agents
插件 --plugin-dir--plugin-url
额外目录 --add-dir

示例:

1
2
3
4
claude --bare -p "审查当前分支" \
--append-system-prompt-file ./ci/review-policy.md \
--settings ./ci/claude-settings.json \
--allowedTools "Read,Grep,Glob,Bash(git diff *)"

这些输入应固定版本并受代码审查。

2.3 Bare mode 的认证差异

Bare mode 不读取 OAuth 和系统 Keychain。Anthropic 直连认证需使用:

  • ANTHROPIC_API_KEY
  • 或通过 --settings 显式提供 apiKeyHelper

它不读取 CLAUDE_CODE_OAUTH_TOKEN。Bedrock、Agent Platform 和 Foundry 仍使用各自提供商凭据。

不要为了让 Bare mode 工作而把 API Key 写入命令行、仓库或日志。使用 CI Secret 注入环境。

2.4 --safe-mode 不是 --bare

1
2
3
4
5
--bare
面向可复现脚本,最小启动并要求显式提供配置。

--safe-mode
面向故障排查,关闭自定义内容但保留认证、模型、内置工具和权限。

Safe mode 仍受组织 Managed policy 约束。不要用它规避组织设置。

3. 输入与管道

3.1 标准输入

1
2
cat build-error.txt |
claude --bare -p "区分首个根因和后续连锁错误"

标准输入适合临时数据。官方当前限制管道输入为 10 MB。超出时应把数据保存为文件,让 Claude 按路径和范围读取,而不是把完整内容塞进上下文。

3.2 预处理数据

1
2
3
rg -n "ERROR|FATAL|Caused by" server.log |
head -n 500 |
claude --bare -p "按时间顺序归纳故障链"

预处理应保持关键上下文。过度筛选可能删除根因,脚本应保存原始日志位置供后续按需读取。

3.3 重定向输出

1
claude --bare -p "生成当前模块架构摘要" > architecture.txt

重定向会覆盖目标文件。脚本应写入明确的构建输出目录,并避免覆盖人工维护文件。

4. 输出格式

4.1 Text

1
claude --bare -p "解释认证模块"

适合人读,不适合作为稳定解析协议。

4.2 JSON

1
claude --bare -p "概括项目" --output-format json

返回单个 JSON 对象,包含结果、session ID、用量和成本等元数据。文本结果在 result

1
2
claude --bare -p "概括项目" --output-format json |
jq -r '.result'

脚本应检查:

  • claude 退出码;
  • JSON 是否可解析;
  • 结果字段是否存在;
  • 是否达到预算或发生模型回退;
  • stderr 是否有告警。

4.3 JSON Schema

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
claude --bare -p "列出 src/routes 中的端点" \
--output-format json \
--json-schema '{
"type": "object",
"properties": {
"endpoints": {
"type": "array",
"items": {
"type": "object",
"properties": {
"method": {"type": "string"},
"path": {"type": "string"},
"file": {"type": "string"}
},
"required": ["method", "path", "file"]
}
}
},
"required": ["endpoints"]
}'

结构化结果位于 structured_output。Schema 应:

  • 只要求下游真正需要的字段;
  • 明确 required;
  • 用 enum 限制有限值;
  • 为数组项定义结构;
  • 在 CI 中加入解析测试;
  • 不依赖自然语言字段。

4.4 Stream JSON

1
2
3
4
claude --bare -p "分析大型差异" \
--output-format stream-json \
--verbose \
--include-partial-messages

每行一个 JSON 事件,最后是 result。适合实时 UI、日志和长任务。

使用 jq 只显示文本增量:

1
2
3
4
5
claude --bare -p "解释递归" \
--output-format stream-json \
--verbose \
--include-partial-messages |
jq -rj 'select(.type == "stream_event" and .event.delta.type? == "text_delta") | .event.delta.text'

生产消费者应忽略未知事件,以 capability 字段进行特性探测,而不是只比较版本号。

5. 自动化中的工具权限

5.1 --allowedTools

1
2
claude --bare -p "运行测试并修复失败" \
--allowedTools "Read,Edit,Bash(npm test *)"

应使用最小工具:

1
2
3
4
5
6
7
8
只读审查:
Read,Grep,Glob,Bash(git diff *),Bash(git status *)

生成文档:
Read,Grep,Glob,Edit

测试修复:
Read,Grep,Glob,Edit,Bash(npm test *),Bash(npm run typecheck)

不要为了省事使用:

1
2
3
Bash
Edit
mcp__*

宽泛允许会使无人值守任务难以审计。

5.2 dontAsk

1
2
3
claude --bare -p "只读检查当前差异" \
--permission-mode dontAsk \
--allowedTools "Read,Grep,Glob,Bash(git diff *),Bash(git status *)"

dontAsk 不会显示无法回答的权限提示,未允许操作会直接拒绝,适合 CI。提示中应告诉 Claude 在权限不足时报告缺口,而不是不断尝试替代路径。

5.3 acceptEdits

1
2
3
claude --bare -p "应用 lint 自动修复" \
--permission-mode acceptEdits \
--allowedTools "Bash(npm run lint -- --fix)"

它允许文件编辑和部分常见文件命令,其他 shell 与网络仍需规则。

5.4 auto

1
claude -p "修复全部 lint 错误" --permission-mode auto

Auto mode 只有账号、模型和组织策略满足条件时可用。非交互模式中如果分类器反复阻止,任务会中止,因为没有用户接管。

5.5 bypassPermissions

官方只建议在额外隔离的环境中使用。一个最低要求包括:

  • 临时容器或 VM;
  • 仅挂载本任务目录;
  • 无个人主目录;
  • 无 SSH、云、包发布和生产凭据;
  • 网络默认关闭或严格 allowlist;
  • 运行后丢弃;
  • 输出和差异仍需审查。

即使满足,也应优先尝试 dontAsk + 精确 Allow。

6. 预算、超时与退出

6.1 限制 API 预算

API 计费场景可使用:

1
2
3
claude --bare -p "审查当前差异" \
--max-budget-usd 2.00 \
--output-format json

预算值应根据任务和组织策略确定。达到预算时任务可能未完成,下游不能把“进程有输出”当作成功。

6.2 外层超时

除了 Claude Code 内部超时,CI 应设置 Job 级超时。需要区分:

  • API 重试;
  • MCP 启动;
  • 测试命令;
  • 后台子代理;
  • 整体任务。

超时后保留 stderr、结构化结果、session ID 和差异,便于恢复。

6.3 后台任务

-p 中启动的后台 Bash 进程会在最终结果后获得短暂宽限,然后被终止。不要用一次性 -p 长期托管开发服务器。

后台子代理和 Workflow 会等待结果,但官方当前有默认等待上限。需要长时间常驻任务时使用合适的进程管理器,而不是依赖 Claude Code 子进程。

7. 在脚本中继续会话

第一次运行:

1
2
result_json=$(claude -p "分析失败测试" --output-format json)
session_id=$(printf '%s' "$result_json" | jq -r '.session_id')

继续:

1
2
3
claude -p --resume "$session_id" \
"根据刚才的分析给出最小修复方案" \
--output-format json

注意:

  • -p 会话不一定出现在交互选择器中,但可用 session ID 恢复;
  • 从原任务目录运行;
  • 恢复时重新传入必要 --settings、MCP、插件和额外目录;
  • 自动化应保存 session ID,但不要解析内部 JSONL 转录格式;
  • 并行分支使用 --fork-session,避免消息交错。

8. CI 审查示例

目标:只读检查相对 origin/main 的差异,并输出结构化缺陷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
git fetch origin main

git diff --unified=80 origin/main...HEAD |
claude --bare -p \
"你是 task-board 的只读审查器。
只报告会影响正确性、安全性、数据一致性或明确需求的问题。
每项必须包含文件、行、严重度、触发条件和影响。
不报告纯风格偏好。" \
--permission-mode dontAsk \
--output-format json \
--json-schema '{
"type":"object",
"properties":{
"findings":{
"type":"array",
"items":{
"type":"object",
"properties":{
"severity":{"type":"string","enum":["high","medium","low"]},
"file":{"type":"string"},
"line":{"type":"integer"},
"summary":{"type":"string"},
"impact":{"type":"string"}
},
"required":["severity","file","line","summary","impact"]
}
}
},
"required":["findings"]
}' > claude-review.json

安全设计:

  • 差异通过 stdin 提供,不授予 Bash;
  • Bare mode 不加载开发者私人插件与 Hooks;
  • dontAsk 防止无人回答的提示;
  • 不授予 Edit;
  • 不提供 GitHub Token;
  • 结构化输出供后续程序处理;
  • CI 仍需检查退出码和 JSON;
  • AI 审查不是静态分析、测试和人工评审的替代品。

9. 模型选择

9.1 使用别名

1
claude --model sonnet

会话内:

1
2
/model
/model opus

官方当前提供的常见选择包括:

别名 典型用途
default 账号或组织推荐默认
best 可用时选择最强推荐模型
fable 最长、最难的自主任务
sonnet 日常编码
opus 复杂推理
haiku 简单、快速、低成本任务
opusplan Plan 使用 Opus,执行切换 Sonnet

别名解析会随提供商和时间变化。需要可重复性时使用组织批准的完整模型名,但同时建立退役和升级流程。

9.2 设置优先级

常见顺序:

  1. 会话内 /model
  2. 启动参数 --model
  3. ANTHROPIC_MODEL
  4. 设置文件 model

恢复会话可能继续原模型,但命令行覆盖、模型退役、组织允许列表和第三方部署名会影响结果。

9.3 Effort

1
claude --model sonnet --effort high

会话内:

1
/effort

官方当前层级包括 lowmediumhighxhighmax,具体取决于模型:

  • low:短小、明确、对智能不敏感;
  • medium:成本敏感且可接受能力折中;
  • high:多数复杂编码的平衡选择;
  • xhigh:更深推理、更高 token;
  • max:最难任务,可能出现收益递减和过度思考。

不要把所有任务永久设为最高。通过实际正确率、延迟和成本评估。

10. 成本与上下文

10.1 查看用量

会话内:

1
/usage

API 计费时,JSON 输出还包含 total_cost_usd 和模型用量信息。订阅和组织环境的显示与计费方式可能不同。

10.2 降低消耗

官方建议的主要方向:

  • /clear 分隔无关任务;
  • /compact 压缩长会话;
  • 为提示限定目录和验证;
  • 用子代理承接高输出调查;
  • 把偶尔使用的说明从 CLAUDE.md 移到 Skill;
  • 断开不使用的 MCP;
  • 安装合适 LSP,减少粗放文件读取;
  • 让 Hook 预处理大日志;
  • 小任务选择合适模型和 Effort;
  • 并行 Agent 只用于可并行且收益足够的任务;
  • 为复杂任务提供验证,减少人工来回纠正。

10.3 为什么长会话越来越贵

每轮请求需要携带可见上下文。随着文件、命令输出和对话累积:

  • 输入 token 上升;
  • 压缩频率上升;
  • 无关内容降低判断质量;
  • 切换模型可能失去 Prompt Cache 命中;
  • MCP 与扩展增加常驻描述。

成本优化首先是上下文设计,不只是换更便宜模型。

11. 系统排障顺序

11.1 第一步:分类

症状 首选入口
命令不存在、PATH、TLS、安装权限 安装与登录排障
OAuth、403、组织或云凭据 认证排障
设置、Hook、MCP、Skill 不生效 配置调试
429、5xx、模型不存在 Error reference
高 CPU、内存、卡住、搜索问题 Troubleshooting

11.2 第二步:版本与只读诊断

1
2
claude --version
claude doctor

检查:

  • 是否多重安装;
  • 设置 JSON 是否有效;
  • 搜索工具是否工作;
  • 更新是否失败;
  • PATH 指向哪一个二进制。

11.3 第三步:会话内可观察性

1
2
3
4
5
6
7
/status
/context
/permissions
/hooks
/mcp
/skills
/doctor

不要直接删除配置。先确认“是否加载”和“从哪里加载”。

12. 配置问题

12.1 设置优先级

settings.local.json 会覆盖项目和用户标量。使用:

1
/status

查看 Setting sources。数组可能跨作用域合并,不能只看一个文件。

12.2 CLAUDE.md 未遵守

先看:

1
/context

若未出现:

  • 路径不正确;
  • 在子目录中,尚未读取匹配文件;
  • --setting-sources 排除了项目;
  • Safe 或 Bare mode 关闭了自动加载。

若已出现但未遵守:

  • 指令过长;
  • 表述含糊;
  • 多个文件冲突;
  • 内容属于偶发流程,应移到 Skill;
  • 需要硬性保证,应改用权限或 Hook。

12.3 Skill 不出现

正确路径:

1
.claude/skills/<name>/SKILL.md

使用 /skills 检查。disable-model-invocation: true 的 Skill 不会自动触发。

12.4 Hook 不触发

1
claude --debug hooks

检查 matcher 是单个字符串、工具名大小写、脚本权限、JSON stdout 和设置文件位置。

12.5 MCP 不加载

1
/mcp
1
2
3
claude mcp list
claude mcp get <name>
claude --debug mcp

常见原因:

  • .mcp.json 放进 .claude/
  • 写进 settings.json
  • local Server 在另一个项目注册;
  • Project Server 未批准;
  • stdio 使用相对脚本路径;
  • OAuth 未完成;
    -环境变量放错位置;
  • 启动超过默认超时。

13. 使用 Safe mode 定位定制问题

1
claude --safe-mode

它会关闭 CLAUDE.md、Skills、插件、Hooks、MCP、自定义 Agent、输出风格和其他定制,但保留:

  • 认证;
  • 模型选择;
  • 内置工具;
  • 权限;
  • Managed policy。

如果问题消失,逐项检查:

  1. /context
  2. /hooks
  3. /mcp
  4. /skills
  5. 插件;
  6. 项目与本地设置。

13.1 完全独立配置目录

macOS、Linux 或 WSL:

1
2
3
mkdir -p /tmp/claude-clean
cd /tmp
CLAUDE_CONFIG_DIR=/tmp/claude-clean claude

Windows PowerShell:

1
2
3
4
5
$cleanDir = Join-Path $env:TEMP "claude-clean"
New-Item -ItemType Directory -Path $cleanDir -Force | Out-Null
$env:CLAUDE_CONFIG_DIR = $cleanDir
Set-Location $env:TEMP
claude

该方式会绕开通常的用户配置;Linux 和 Windows 可能需要重新登录。Managed policy 仍可生效。测试结束后不要把临时配置当作长期主配置。

14. 性能、卡住与搜索

14.1 高 CPU 或内存

依次尝试:

  1. /compact
  2. 在主要任务之间重启;
  3. 忽略大型生成目录;
  4. claude --safe-mode 排除扩展;
  5. /doctor

必要时 /heapdump 会生成堆快照。官方警告堆快照包含进程中的所有字符串,可能包括对话和凭据,不得公开上传;报告问题时优先分享不含内容的 diagnostics JSON。

14.2 命令卡住

1
Ctrl+C

关闭后:

1
claude --resume

如果反复卡在同一 Hook、MCP 或工具,使用 Debug 和 Safe mode 定位,而不是无限重试。

14.3 搜索不到文件

Claude Code 通常自带 ripgrep。内置版本异常时安装系统版:

1
2
3
4
5
# Ubuntu/Debian
sudo apt install ripgrep

# macOS
brew install ripgrep

Windows:

1
winget install BurntSushi.ripgrep.MSVC

设置:

1
export USE_BUILTIN_RIPGREP=0

再运行:

1
claude doctor

确认 Search 指向系统 ripgrep。

WSL 项目位于 /mnt/c 时可能搜索较慢或结果不完整,优先移动到 /home 或使用 Windows 原生 Claude Code。

14.4 自动压缩抖动

错误表明压缩后又立即被超大文件或输出填满。处理:

  • 分段读文件;
  • 只保留需要的日志;
  • 使用子代理;
  • /compact 指定保留内容;
  • 无需历史时 /clear

15. 日常维护清单

每周或版本升级后:

1
2
claude --version
claude doctor

会话内:

1
2
3
4
5
/doctor
/usage
/context
/plugin
/mcp

检查:

  • 是否需要更新;
  • 是否存在无效设置;
  • 是否有未使用插件;
  • MCP 是否仍必要;
  • CLAUDE.md 是否过长;
  • Skills 是否重复;
  • Allow 规则是否过宽;
  • Auto memory 是否含过期或敏感内容;
  • 工作树是否残留重要未提交工作;
  • CI 模型、预算和结构化输出是否仍符合当前版本。

16. 系列总结

完整掌握 Claude Code CLI,核心不是记住所有命令,而是建立一套稳定操作模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
正确目录与可信配置

明确目标、范围和验证

探索—规划—实现—验证

用 CLAUDE.md 和 Rules 提供项目上下文

用权限、Hook 与沙箱落实边界

用会话、检查点、Git 和 worktree 管理状态

用 Skill、子代理、MCP 和插件按需扩展

用 Bare、结构化输出和最小权限进行自动化

用 /context、/doctor、Safe mode 和 Debug 排障

随着版本更新,应优先查阅官方文档、当前 claude --help、会话内 /help 和 Changelog。第三方教程适合提供经验,但不应替代官方命令语义、权限边界和安全说明。

17. CLI 命令索引

Claude Code 的命令面会随版本、平台、套餐和登录方式变化。下面不是替代 --help 的静态全量清单,而是按用途整理的检索入口。遇到本文未列出的参数时,应依次运行:

1
2
claude --help
claude <subcommand> --help

进入会话后,输入 / 可以浏览当前环境实际可用的全部命令,输入 /help 查看帮助。官方 Commands 页面同时标注了版本差异与可用性条件。

17.1 Shell 子命令

子命令 主要用途
claude [prompt] 启动交互会话,可附带第一条任务
claude auth 管理登录与认证
claude doctor 检查安装和当前目录配置;会话内 /doctor 还能引导修复
claude install [target] 安装原生构建,可指定稳定版、最新版或具体版本
claude update 检查并安装可用更新
claude mcp 配置和管理 MCP 服务器
claude plugin 管理插件
claude project 管理 Claude Code 项目状态
claude agents 查看和管理后台代理会话
claude setup-token 为支持的 Claude 订阅配置长期认证令牌
claude auto-mode 查看或重置 Auto mode 分类器配置
claude gateway 运行企业认证或遥测网关;只适用于相应的组织部署
claude ultrareview 发起云端多代理代码审查;是否可用取决于账户、套餐和当前版本

例如,查询 MCP 子命令的精确参数:

1
claude mcp --help

17.2 启动参数分组

目标 主要参数
增加工作目录 --add-dir
选择代理 --agent--agents
控制内置工具 --tools--allowedTools--disallowedTools
选择权限模式 --permission-mode
非交互调用 -p--input-format--output-format--json-schema
流式事件 --include-partial-messages--include-hook-events--forward-subagent-text
会话恢复与分支 --continue--resume--fork-session--session-id--from-pr--name
会话持久化 --no-session-persistence
选择模型与推理强度 --model--effort--fallback-model
成本上限 --max-budget-usd
临时配置 --settings--setting-sources
临时系统指令 --system-prompt--append-system-prompt
诊断 --debug--debug-file--verbose--safe-mode
最小化脚本环境 --bare
MCP 隔离 --mcp-config--strict-mcp-config
临时插件 --plugin-dir--plugin-url
Git 隔离 --worktree,以及配套的 --tmux
后台运行 --background
可访问性 --ax-screen-reader
可选外部集成 --ide--chrome--remote-control

以下两个参数会解除权限保护,不能仅为减少确认次数而使用:

1
2
--allow-dangerously-skip-permissions
--dangerously-skip-permissions

官方帮助只建议在无互联网访问的隔离沙箱中考虑它们。即使在 CI 中,也应优先使用 dontAsk、精确的 Allow/Deny 规则和系统级沙箱。

17.3 会话内命令分组

阶段 常用命令
初始化与状态 /init/status/doctor/help
工作边界 /permissions/config/add-dir/cd
规划与执行 /plan/model/effort/tasks
上下文管理 /context/compact/clear/btw
会话管理 /resume/branch/fork/rename/rewind
查看与验证 /diff/verify/review/security-review
扩展 /memory/mcp/plugin/hooks
监控与成本 /usage/background/tasks
认证与反馈 /login/logout/bug

/agents 的当前行为尤其需要注意:从 Claude Code 2.1.198 起,它不再打开子代理创建向导,而是提示用户直接要求 Claude 创建或管理子代理,或编辑 .claude/agents/~/.claude/agents/。这类版本敏感行为应以当前 Commands 页面为准。

参考资料