Claude Code CLI 模式完全指南
用了一年多 Claude Code,我有个发现:用 VS Code 插件的人,大概只用到了 Claude Code 能力的一半。另一半在 CLI 里。插件模式适合"交互式"的工作——你在编辑器里写代码,遇到问题随手问 Claude。CLI 模式适合"批处理式"的工作——你需要对一批文件做同样的操作,或者把 Claude 嵌入自动化流程,或者在没有 GUI 的服务器环境里使用。这两个模式不是替代关系

用了一年多 Claude Code,我有个发现:用 VS Code 插件的人,大概只用到了 Claude Code 能力的一半。
另一半在 CLI 里。
插件模式适合"交互式"的工作——你在编辑器里写代码,遇到问题随手问 Claude。CLI 模式适合"批处理式"的工作——你需要对一批文件做同样的操作,或者把 Claude 嵌入自动化流程,或者在没有 GUI 的服务器环境里使用。
这两个模式不是替代关系,是互补关系。但 CLI 模式明显被低估了——它能做的事情,很多人根本没想到。
为什么 CLI 模式值得单独学
我是被一个具体的场景逼着去研究 CLI 的。
有一次我的出海项目做了一次大规模重构,把所有的 API 错误返回格式统一改了。问题是项目里有 23 个 API 路由文件,每个都要改。
用插件模式,我需要:打开文件 → 触发 Claude → 输入 Prompt → 接受修改 → 下一个文件,循环 23 次。算了一下,就算每个文件花 3 分钟,23 个文件就是 70 分钟。
用 CLI,我写了一个 shell 脚本,把所有路由文件路径传给 Claude,统一处理,20 分钟全部搞定,还顺手生成了改动日志。
CLI 的本质优势:可编程、可批处理、可集成进任何工作流。
第一步:安装和验证
如果你只装了 VS Code 插件,没有装 CLI,先补上:
npm install -g @anthropic-ai/claude-code
验证安装:
claude --version
验证 API Key 配置:
claude -p "用一句话介绍你自己"
如果返回了正常的回答,说明 CLI 已经连接到你的 API Key,可以开始用了。
这里有个细节要注意: CLI 和 VS Code 插件共享同一个 API Key 配置。如果你之前在插件里配过 Key,CLI 会自动读取,不需要重新配。但如果你用的是自定义端点(比如通义千问),需要单独在 CLI 里配置环境变量:
export ANTHROPIC_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
export ANTHROPIC_API_KEY=sk-你的key
第二步:基础用法——从简单指令开始
最基础的用法:-p 单次对话
claude -p "解释一下 React 的 useCallback 和 useMemo 的区别,100字以内"
-p 是 --print 的缩写,表示"执行这个 Prompt,输出结果,然后退出"。不进入交互模式,适合脚本调用。
说人话就是: -p 就是"帮我做这一件事,做完就走"。
把文件内容传给 Claude:管道操作
cat src/lib/utils.ts | claude -p "找出这个文件里所有可能的运行时错误,列出来"
用管道(|)把文件内容传给 Claude,它就能直接分析。
更实用的写法是用文件重定向:
claude -p "Review 这段代码,找出类型不安全的地方" < src/api/payment.ts
这里有个细节要注意: 管道传入的内容会被 Claude 当作"上下文",你的 -p 指令是对这个上下文的操作。所以 Prompt 要写"对这段内容做什么",而不是"帮我找一个文件"。
输出结果写入文件:重定向输出
claude -p "为这个函数写 JSDoc 注释" < src/utils/formatCurrency.ts > output.ts
把 Claude 的输出重定向到文件。不过我更常用的是结合 --output-format 参数控制输出格式。
第三步:进阶用法——真正提升效率的地方
批量处理文件:用 find + xargs
这是我用 CLI 最多的场景。把一批文件批量交给 Claude 处理:
下面这个脚本把项目里所有 API 路由文件统一加上请求日志:
#!/bin/bash
# add-request-logging.sh
# 为所有 API 路由文件加上请求日志
find app/api -name "route.ts" | while read file; do
echo "处理: $file"
claude -p "
在这个 Next.js API 路由文件里加上请求日志:
- 在每个 handler 函数开头加 console.log,格式:[METHOD] /path - timestamp
- timestamp 用 UTC 格式:new Date().toISOString()
- 不要改动其他逻辑
输出完整的修改后文件内容,不要加任何解释。
" < "$file" > "${file}.tmp" && mv "${file}.tmp" "$file"
echo "完成: $file"
done
echo "全部处理完毕"
说人话就是: 这个脚本找到所有 route.ts 文件,逐个传给 Claude 处理,把输出结果覆盖原文件。你只需要跑一次命令,23 个文件全搞定。
这里有个细节要注意: 先输出到 .tmp 文件再 mv 覆盖,而不是直接 > "$file",是为了防止 Claude 处理失败时把原文件清空。这个细节我吃过亏,直接重定向的话,如果 API 调用失败,原文件就变成空文件了。
结构化输出:--output-format json
当你需要把 Claude 的输出用于后续程序处理时,用 JSON 格式输出:
claude -p "
分析这个文件,返回 JSON 格式:
{
\"functions\": [函数名列表],
\"exports\": [导出名列表],
\"dependencies\": [import 的依赖列表],
\"hasTests\": boolean
}
只返回 JSON,不要其他内容。
" --output-format json < src/lib/stripe.ts
然后在 shell 脚本里用 jq 解析:
result=$(claude -p "..." --output-format json < src/lib/stripe.ts)
functions=$(echo $result | jq -r '.functions[]')
echo "发现以下函数:$functions"
大多数教程不告诉你的细节: --output-format json 并不是让 Claude 输出 JSON 的唯一方式,但它会对输出做一层包装,确保结果是合法的 JSON 字符串,不会出现特殊字符导致解析失败的问题。如果只是在 Prompt 里说"输出 JSON",偶尔会有格式问题。
交互模式:--interactive
不加 -p,直接运行 claude,进入交互模式——和 VS Code 插件的对话体验类似,但在终端里:
claude --interactive
适合在服务器上临时调试,或者在不方便打开编辑器的场景下用。
我在部署脚本出问题时,会直接在服务器上进交互模式让 Claude 帮我排查——比本地 SSH 过来再打开编辑器快多了。
设置系统提示词:--system
给整个 CLI 会话设置一个系统级提示词:
claude --system "你是一个专注于出海 Web 开发的 TypeScript 工程师,所有代码必须符合以下规范:金额用整数(分为单位),时间用 UTC,多语言用 i18n key" -p "写一个获取用户订单列表的 API 路由"
说人话就是: --system 相当于临时的 CLAUDE.md,不会永久保存,只对当次命令有效。适合在脚本里临时注入项目规范,不需要修改项目配置文件。
第四步:实战脚本工具集
这些脚本我在出海项目里真实在用,直接复制放到项目根目录的 scripts/claude/ 目录下。
脚本一:批量 Code Review
#!/bin/bash
# scripts/claude/review.sh
# 用法:./scripts/claude/review.sh [文件路径]
# 示例:./scripts/claude/review.sh src/app/api/payment/route.ts
FILE=${1:-""}
if [ -z "$FILE" ]; then
echo "用法: $0 <文件路径>"
exit 1
fi
if [ ! -f "$FILE" ]; then
echo "文件不存在: $FILE"
exit 1
fi
echo "🔍 正在 Review: $FILE"
echo "================================"
claude -p "
对这个文件做专业的 Code Review,重点检查以下方面:
1. **类型安全**:有没有 any、类型断言滥用、可能的 null/undefined 问题
2. **出海场景**:时区处理是否正确、金额是否用整数、字符串是否有编码问题
3. **安全性**:有没有 SQL 注入风险、XSS 风险、敏感信息泄漏
4. **性能**:有没有 N+1 查询、不必要的全量加载、缺少分页
5. **错误处理**:所有异步操作是否有 try-catch、错误是否有合理的用户提示
对每个问题说明:问题在第几行、严重程度(高/中/低)、建议怎么修复。
如果没有问题就说「本文件 Review 通过」。
" < "$FILE"
脚本二:自动生成 i18n 文案
#!/bin/bash
# scripts/claude/gen-i18n.sh
# 用法:./scripts/claude/gen-i18n.sh "功能名称" "key前缀"
# 示例:./scripts/claude/gen-i18n.sh "用户设置页" "settings.profile"
FEATURE=${1:-"新功能"}
PREFIX=${2:-"feature"}
claude -p "
为「${FEATURE}」功能生成完整的 i18n 文案,key 前缀为 \"${PREFIX}\"。
需要包含以下类型的文案:
- 页面标题、小节标题
- 表单标签、占位符、帮助文字
- 按钮文字(保存、取消、确认、删除等)
- 成功/失败/警告提示
- 空状态文案
输出两个 JSON 对象,格式如下,直接输出不要其他内容:
英文版(en.json 片段):
{JSON}
中文版(zh.json 片段):
{JSON}
"
脚本三:生成迁移前的影响分析
#!/bin/bash
# scripts/claude/migration-impact.sh
# 在执行数据库迁移前,分析影响范围
# 用法:./scripts/claude/migration-impact.sh prisma/migrations/最新迁移文件.sql
MIGRATION_FILE=${1:-""}
if [ -z "$MIGRATION_FILE" ]; then
# 自动找最新的迁移文件
MIGRATION_FILE=$(find prisma/migrations -name "*.sql" | sort | tail -1)
fi
echo "📊 分析迁移影响范围:$MIGRATION_FILE"
claude -p "
分析这个数据库迁移 SQL,评估影响范围:
1. **破坏性变更**:有没有删列、改类型、加非空约束等可能导致数据丢失的操作
2. **影响的 API**:根据表名推断哪些 API 路由可能需要同步修改
3. **迁移风险**:生产环境执行这个迁移有什么风险,需要停服吗
4. **回滚方案**:如果迁移失败,如何回滚
用表格输出「影响的表」和「影响级别」,然后用文字描述建议的操作步骤。
" < "$MIGRATION_FILE"
踩坑环节
坑一:脚本处理大文件时 API 超时
我有个脚本批量处理项目里的所有组件文件,加上 TypeScript 类型检查。跑到第 8 个文件的时候,脚本突然挂死了,半天没有响应。
我发现的方式: 等了 5 分钟,手动 Ctrl+C 终止,看到一个超时错误。那个文件是个特别大的表单组件,有 600 多行。
怎么解决的: 加了两个保险机制:
# 1. 加超时限制,超过 60 秒就跳过
timeout 60 claude -p "..." < "$file" || echo "⚠️ 跳过(超时):$file"
# 2. 大文件先截取前 200 行分析
if [ $(wc -l < "$file") -gt 300 ]; then
echo "文件较大,只分析前 200 行"
head -200 "$file" | claude -p "..."
else
claude -p "..." < "$file"
fi
坑二:并行处理导致 API 限流
觉得串行太慢,改成并行处理——用 & 让多个 Claude 进程同时跑:
# 这样写会触发限流
find app/api -name "route.ts" | while read file; do
claude -p "..." < "$file" & # 同时启动多个进程
done
wait
结果跑了没几秒,开始大量报 Rate limit exceeded,一半文件没处理完。
我发现的方式: 终端里一堆红色的错误信息,看日志发现是 429 错误。
怎么解决的: 改成限速的并行,用 xargs -P 控制最大并发数,同时加请求间隔:
find app/api -name "route.ts" | xargs -P 3 -I {} bash -c '
sleep $((RANDOM % 3)) # 随机延迟 0-2 秒,错开请求
claude -p "..." < "{}"
'
-P 3 表示最多同时 3 个进程,加上随机延迟,基本不会再触发限流。
CLI 模式是 Claude Code 被严重低估的一半。 插件模式让你和 AI 对话,CLI 模式让 AI 融进你的工程流水线。两个都会用,才是真正意义上的 AI 辅助开发。
你现在有没有什么重复性的开发工作——每次都要做,每次都一样,就是懒得自动化?
说出来,我帮你想想用 Claude Code CLI 能不能一条命令搞定。
更多推荐

所有评论(0)