AI带你学|Claude 命令的参数:给一个自主 Agent 划边界

CLAUDE CODE · 心智模型

Claude 命令的参数

给一个自主 Agent 划边界

这不是一份参数清单——具体怎么写,claude –help 和 AI 都比你记得准。
这里想讲清楚的是:为什么会有这么一层东西,什么时候你会自然想到它,以及哪些地方它其实帮不了你。

导读 · 内容摘要

会话开始,你用自然语言指挥它;会话开始,你只能用参数。这条分界线决定了参数系统的全部形状——它真正服务的对象不是打字的人,而是调用它的程序。本文按「你实际会栽在哪里」的顺序,讲透其中最要紧的几处:能力与权限的区分、-p 带来的契约切换、上下文为什么是预算、隔离能挡住什么挡不住什么,以及最后一节——参数从设计上就解决不了的那些问题。

全文约 7000 字 · 建议收藏后阅读
内容使用李笑来老师「AI时代学习地图」提示词,由 Opus 5 生成
文中具体参数名随版本演进,用 claude –help 核对即可;框架长期有效

一个搬不过去的工作流

01 · WHY

你在终端里跟 Claude 干了半小时活。它想改一个不该改的文件,你说别动;它跑偏了,你按 Esc 拉回来;它问「要执行 rm -rf build/ 吗」,你扫一眼路径,回车放行。

这半小时里你其实一直在做同一件事:实时地给它划边界。只是做得太自然,你不会把它当成一项工作。

然后你想把同样的流程搬进 CI——每个 PR 自动审一遍,半夜跑,没人看着。

搬过去的那一刻,前面那半小时里你做的每一件事都失效了。没有人能回答「是否允许执行这条命令」;没有人能按 Esc;没有人会看见它跑偏;甚至没有人知道它跑完花了多少钱。你唯一还能说话的时机,是在它启动之前

参数就是这个时机里唯一的语言。

帮助文本自己写着

翻一遍 claude –help,会看到一批参数带着同一句注脚——only works with –print

–output-format · –json-schema · –max-budget-usd · –fallback-model · –input-format · –no-session-persistence

它们全都只在「没有人坐在屏幕前」的那一侧生效。参数系统真正服务的对象不是打字的人,而是调用它的程序。

理解这一点,整份参数列表的形状就变了。它不是一堆功能开关,而是一个构造函数的签名:

claude(身份, 上下文, 能力, 权限, 场地, 记忆, 输出契约) -> Agent

它和「在 prompt 里写规矩」的区别

没有参数层的时候,人们只有三条路:全程盯着(无法规模化)、在 prompt 里写「请不要删除文件」(这是请求,不是约束)、或者整个丢进容器(粒度粗、反馈环长)。

参数的价值,是把「请求」变成执行时绕不过去的机制

七个问题,不是七十个名字

02 · THE AXES

参数有五六十个,还在往上加,短选项、别名、枚举值随版本变。背它们既不现实也没价值——那是 AI 干的活。真正值得装进脑子的,是每次跑 Agent 之前问自己的七个问题。

 谁来做? 身份

哪个模型、想多久、扮演什么角色

–model · –effort · –agent · –fallback-model

 它知道什么? 上下文

系统提示、可见目录、配置来源

–system-prompt · –append-system-prompt · –add-dir · –setting-sources

 它能做什么? 能力

内置工具、MCP、插件

–tools · –mcp-config · –strict-mcp-config · –plugin-dir

 它被允许做什么? 权限

信任姿态、白名单、黑名单

–permission-mode · –allowedTools · –disallowedTools · –dangerously-skip-permissions

 它在哪里做? 场地

工作树、后台、终端

–worktree · –background · –tmux · –remote-control

 它记得什么? 记忆

新建、恢复、分叉、不留痕

–continue · –resume · –session-id · –fork-session · –no-session-persistence

 结果给谁? 输出契约

人眼、程序、类型契约、预算

–print · –output-format · –json-schema · –max-budget-usd

七个轴的好处不在于分类整齐,而在于遇到任何一个没见过的新参数,你都能立刻知道它在管什么;反过来,遇到任何一个需求,你也知道该往哪个方向找,哪怕想不起具体拼写。

但这七个轴的重要性差得非常远。下面不按编号讲,按你实际会栽在哪里的顺序讲。

能力和权限是两件事

03 · AUTHORITY

这是整套参数里最重要、也最容易混淆的一处区分。

· 能力回答的是:这只手在不在。–tools 决定 Agent 有哪些内置工具,–mcp-config 决定它能不能碰数据库和内部 API。

· 权限回答的是:这只手能不能动。–permission-mode 设定默认信任姿态,–allowedTools / –disallowedTools 在这个姿态上开例外。

一次工具调用要走完这条链,才会真的执行:

裁决顺序

起点:Agent 想调用某个工具

这个工具在 –tools 里吗?
否 → 不可能发生,能力根本不存在

命中 –disallowedTools 吗?
是 → 拒绝

命中 –allowedTools 吗?
是 → 直接执行,已预授权

都没命中 → 落到 –permission-mode,由信任姿态决定问不问人

看懂这条链,就能拆掉一个很常见的误会:–allowedTools 不是用来「开启」工具的。名字里有 allowed,看着像开关,其实它是预授权——决定的是「用这个工具还需不需要问一句」,而不是「有没有这个工具」。给一个不在 –tools 里的工具做预授权,一点作用都没有。

一条能长期用的顺序

先砍能力,再收权限。

不存在的能力没有边缘情况可言;而权限规则靠模式匹配工作——像 Bash(git *) 这样的写法,你以为放行的是「git 相关操作」,实际放行的是「所有以 git 开头的命令行」,包括 git config、包括带 -c 的任意配置注入。模式匹配的表达力有限,你想表达的往往比你写下的宽

–dangerously-skip-permissions 不是提速开关

它确实变快了——确认弹窗全没了。但它的本质是责任转移:权限系统的职责被整体移交给了环境隔离。

如果环境是一次性容器、没有网络、没有真凭证,这笔交易划算:权限系统本来的价值是「防止在你在意的环境里造成不可逆后果」,当环境本身不值钱,这个价值归零,而每一步确认的摩擦还在。如果环境是你的开发机,你只是撤掉了安全网,没有换上新的。

判断标准只有一句话

这个环境毁了,我会心疼吗?

如果你没法一句话说清「出错了会毁掉什么」,就说明你还不该用它。

顺带一提,还有个 –allow-dangerously-skip-permissions——它只是让「绕过权限」这个选项在会话里可用,而不是默认开启。两者差一个词,风险差一个量级。

这里也是从业者真正有分歧的地方

一派认为,Agent 就该关在一次性容器里全速跑,逐条确认是在用人的注意力补技术的短板;另一派认为,哪怕在容器里也要保留只读边界,因为「隔离」的容器往往仍有网络、仍挂着凭证、仍能推分支。这个分歧没有通用答案——它取决于你的容器里到底装了什么,而这件事只有你自己知道。

-p 切换的不是显示方式,是契约

04 · CONTRACT

–print 看起来只是「不进入交互界面,打印完就退出」。表面现象没错,但它同时改变的东西远不止 UI:

· 工作区信任对话框被跳过(帮助文本明确写了这点,也顺带提醒:只在你信任的目录里用);

· 校验失败的设置文件被静默忽略,不再弹错误——自动化环境里没人看弹窗,但这也意味着配置写错了你不会知道

· 会话持久化的默认行为变了;

· 前面提到的那一整批参数,到这一侧才被解锁。

所以 -p语义切换:从「人机对话」切到「函数调用」。你不是关掉了界面,你是换了一套契约。

这套契约里最关键的一步跃迁

给自然语言输出加上 –json-schema 之后,claude -p 不再是「一个会说话的程序」,而是「一个输入是自然语言、输出是类型化数据的函数」。这是把 LLM 接进传统软件架构的关键接缝——上游是 shell 管道,下游是 jq,中间那一段可以理解意图。

不过这个能力经常被高估。schema 保证的是形状,不是内容。字段齐了不代表填对了,把 severity 填成「high」是合法的枚举值,也可能是完全错误的判断。schema 把「解析失败」这类问题消掉了,把「判断错误」原样留在原地。真要用在 CI 上,该有的抽样复核一样得有。

同一侧还有一个几乎不该省的参数:–max-budget-usd。它把「不确定的成本」变成「有界的成本」。无人值守的自动化最坏的情况不是做错事,是做错事做了一整夜

上下文是预算,不是仓库

05 · CONTEXT

「多给点上下文总没坏处」是个很自然的直觉,对人成立,对 Agent 不成立。

每加一个 –add-dir,你都在同时做三件事:花钱、稀释注意力、扩大搜索空间。前两件是线性的代价,第三件是非线性的——目录多了以后,Agent 找错文件、改错地方的概率上升得比你预期快。给精确的少量上下文,几乎总是好过「以防万一都给上」。

这一轴里有个值得单独说的区分:–system-prompt替换–append-system-prompt追加。绝大多数场景你想要的是后者——你只是想加一层约束,而不是把 Claude Code 内置的那套行为基座整个扔掉。替换掉之后会连带失去什么,不总是显而易见的。

顺手说一个含金量很高、却总被跳过的参数

–exclude-dynamic-system-prompt-sections 做的事,是把 cwd、环境信息、记忆文件路径、git status 这些逐机器不同的内容,从系统提示挪到第一条用户消息里。目的不是省字数,是提高 prompt cache 的跨用户命中率。

顺带一提,它明确写着「只对默认系统提示生效」——你一旦自己写了 –system-prompt,这个优化就自动失效了。这正是上面那个「替换的代价不总是显而易见」的一个具体例子。

一条反直觉的成本规律

在缓存面前,系统提示「稳定」比「简短」更省钱。一段三千 token 但每次都一模一样的前缀,成本可能远低于一段五百 token 但每次都带着当前时间戳的前缀。批量任务上,这个差距是数量级的。

会话与场地

06 · SESSION & PLACE

会话是对象,不是聊天记录

一旦你不再把会话当成「历史消息的列表」,而当成一个可寻址、可分叉的状态对象,很多用法会自己浮出来。

有 ID

外部系统能引用它——工单、调度器、你的脚本,几小时后仍能精确找回这次对话

–session-id

可分叉

花四十分钟才摸清一个模块,接下来两条路线都想试;分叉远比重建上下文便宜

–fork-session

可命名

并行三个以上会话之后,你会需要它

-n / –name

可丢弃

敏感内容不落盘、不可恢复

–no-session-persistence

隔离是并行的前提,但只挡得住文件冲突

–worktree 看起来是个便利功能——省得来回切分支。从单人单任务的视角看,确实如此。

但把视角换到「同时驱动 N 个 Agent」,它的性质就变了。人类工程师的并行度受限于注意力;Agent 的并行度受限于冲突域。你可以同时开五个 Agent,前提是它们不会同时写同一个文件。worktree 消除的正是这个冲突域,它是并行的物理前提,不是操作上的省事。配上 –background 让会话脱离前台、-n 让你认得出谁是谁,一个人驱动多个 Agent 才真的成立。

一个经常被忽略的边界

worktree 只隔离了文件系统。数据库还是同一个,端口还是那几个,外部 API 的配额是共享的,.env 是同一份,migration 是同一条时间线。三个 Agent 各自跑集成测试、各自往同一张表里写数据的时候,worktree 一点忙都帮不上——那已经不是 CLI 参数能解决的问题了。

模型和思考强度是两个维度

07 · MODEL

–model 决定用哪个大脑,–effort 决定它想多久(low / medium / high / xhigh / max)。这两个是正交的,但很多人把 effort 当成 model 的替代品。

选择依据不是「越强越好」,而是错误成本 vs 单位成本

· 任务可验证、可重跑、错了代价小(批量整理、格式转换、初筛)——便宜模型跑十次,通常比贵模型跑一次更划算。

· 任务一次性、难验证、错了代价大(架构决策、安全相关改动)——该上强模型,还该把 effort 拉高。

实践中一个更常见的正确动作是:先别换模型,先调 effort。同一个模型换个思考强度,往往比换模型更精准地命中你的需求,价格曲线也更平缓。

–fallback-model 是这一轴里的容错件:主模型过载时自动降级,不让整条流水线挂掉。它同样标着 only works with –print——又一个证据,说明这套参数是为无人值守设计的。

你不写参数的时候,它到底加载了什么

08 · DEFAULTS

有三个参数不属于任何一轴,它们是关于参数本身的:

参数 做什么 / 为什么重要
–safe-mode 关掉所有自定义:CLAUDE.md、技能、插件、钩子、MCP、自定义 agent、输出样式、主题……
二分调试的基准线
–bare 极简模式:跳过钩子、LSP、插件同步、自动记忆、后台预取、keychain 读取、CLAUDE.md 自动发现
可复现性的极限
–setting-sources 精确指定加载 user / project / local 中的哪几层
让配置分层从隐式变显式

这三个参数的存在本身就是信息

它们在告诉你:Claude Code 默认会隐式加载一大堆东西——记忆文件、技能、插件、MCP 服务器、钩子、三层设置。你什么参数都不写的时候,你不是「用了默认配置」,你是用了一组你没读过的强参数

所以当行为突然变得奇怪——同样的 prompt,昨天好好的今天很怪——第一个动作不是换模型,是 –safe-mode 跑一次。正常,说明问题在你的配置里,再用 –setting-sources 逐层加回去定位;还是不正常,才轮到怀疑别的。这是最省时间的一步,也是最容易被跳过的一步。

有个细节值得留意:–safe-mode 关掉的是你的自定义,管理员策略仍然生效。这条小注脚透露了整个配置体系的形状——企业策略在最上面,是你绕不过去的。

企业策略 > CLI 参数 > 本地设置 > 项目设置 > 用户设置

排查「为什么它不听我的」,从这条链的顶端往下看。

参数解决不了什么

09 · LIMITS

到这里,容易产生一种错觉:只要边界画得够准,Agent 就能放心跑。并不是。有几件事参数从设计上就管不了。

1它管不到「运行中」

参数是启动前的一次性约束,会话跑起来它就冻结了。运行过程中的拦截是 hooks 的职责。参数负责「能不能开始」,钩子负责「这一步能不能过」——只学参数不学钩子,控制模型是缺一半的。

2它的表达力和你的意图之间有落差

现在的权限模型本质上是「工具 × 模式匹配」。而你脑子里真正想说的是「意图 × 影响范围 × 可逆性」——「可以改测试文件,不能改生产配置」「可以读,但不能把读到的东西发出去」。

前者表达不了后者。中间那段差距,目前只能靠人的判断和环境隔离补上;差距有多大,直接决定了自动化能走多远。

3它提升不了可验证性——而可验证性才是真正的天花板

一个 Agent 能被放多大的权,取决于它的产出能被多快、多便宜地验证。有完整测试和类型检查的代码库,敢开 acceptEdits;没有测试的代码库,你只能一行行看 diff,Agent 立刻退化成一个昂贵的自动补全。

全文最反直觉的一条

想给 Agent 更多自主权,最有效的投入不是研究参数,是去把测试补上。

参数只是把你已有的信任表达出来,它变不出信任。

什么值得记,什么别背

10 · HALF-LIFE

参数这个领域里,知识的半衰期差别很大。

不太会变 · 值得占用记忆

· 能力 ≠ 权限

· 交互 / 非交互是根本分水岭,一半参数只在一侧存在

· 会话是可寻址、可分叉的对象

· 上下文是预算,不是仓库

· 配置有优先级层次,企业策略在最上

· 隔离是并行的前提

· 失败必须有界:预算、降级、只读、隔离

· 可验证性决定自主性上限

会变 · 用的时候查就行

· 参数名、短选项、别名

· –permission-mode 的枚举值(现在有 plan、manual、acceptEdits、auto、dontAsk、bypassPermissions 等好几个,还在动)

· –effort 的档位

· 模型别名与模型 ID

· 哪些参数「仅在 –print 下生效」

· 各子命令的具体形态

一条粗糙但好用的判断法则

回答「是什么问题」的知识长期稳定;回答「怎么写」的知识随时会变。把记忆预算花在前者。

最后

下次要跑一个 Agent,先别去翻 –help

先回答四个问题就够了:谁来做,它能碰到什么,它被允许改什么,结果给谁看。这四个答案定下来,剩下的拼写交给 AI——它比你记得准,而且不会记错版本。

真正换掉的不是你敲命令的方式,是你的角色:
操作者变成边界的设计者

前者的产能上限是你的手速,
后者的上限是你把「我信任它做什么」这件模糊的事,拆解得有多清楚。

维护说明

稳定的部分:七个问题的框架、能力与权限的区分、交互与非交互的分水岭、参数解决不了什么。这些不随版本变。

易变的部分:所有具体参数名与枚举值。用 claude –help 核对即可。

修订原则:出现新参数时,先问「它属于哪个轴」。如果七个轴装不下它,说明该更新的不是这份文档的措辞,而是它背后的世界模型——那才是值得重写的时刻。

* 本文是一份心智模型文档,不是命令手册。文中出现的参数名以说明概念为目的,具体可用性与写法请以 claude –help 的输出为准。

Claude 命令的参数 · 给一个自主 Agent 划边界

By nanikun

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注