生命不息,折腾不止。每天重复抄的那段提示词,敲一次 /commit 就替你展开——这就是这最后一篇要还给你的「第三个零件」。

前面两篇,我们把 Claude Code 的三件套凑齐了俩:Subagents 管「并行拆活」Skills 管「复用流程」。今天就差最后一块、也是最轻的一块——Slash Commands(斜杠命令)。它本质上就是一个「存起来的提示词」,你在输入框敲 /名字,Claude 就把文件里的整段话顶上去替你跑。

这一篇不堆术语,就带你干三件事:手写一个能接参数的 /commit;搞懂 $0 $1 这个坑过无数人的标号;最后把 slash 命令和 skills 的搭配关系彻底说清,串成你自己的完整工作流。

(前提:Claude Code 得先能用。要跑 Anthropic 的 Claude 得有个 Key 或订阅;不想绑卡的,中转站 ai.aklibk.com 国内直连、人民币按量付费,接 Claude Code 兼容接口即可,这个前面讲过了不多说。)

一、斜杠命令到底是个啥:一行 / 触发的提示词

先分两类,别混一起。

内置命令是写死在 CLI 里的、不经过模型推理的固定操作。常用这几个:

  • /clear 清空上下文、开新会话;/compact 把前面聊天压成摘要继续聊
  • /model 中途换模型;/cost(或 /usage)看本次会话花了多少
  • /diff 看改动、/rewind 回滚到检查点、/resume 接着上次会话聊
  • /init 生成项目 CLAUDE.md/help 看帮助

这些你敲 / 就能在列表里看到,权威答案永远是输入框里那个实时菜单。

自定义命令才是今天的正题。它的形态简单到离谱:一个 Markdown 文件,放进对的位置,文件名就是命令名。文件里写什么,敲 /名字 时就把什么顶给 Claude。没有安装器、没有构建、没有注册表。

下面直接动手。

二、第一个自定义命令:写张 /commit

文件放哪?项目级的 .claude/commands/,个人级(所有项目通用)的 ~/.claude/commands/。文件名决定命令名——commit.md 就是 /commit

先写个最朴素的版本:

1
2
3
4
# .claude/commands/commit.md
写一条符合 Conventional Commits 规范的提交信息:
先概括这次改了什么,再补一句为什么这么改。
只输出提交信息本身,不要多余解释,也不要代码块包裹。

/commit,Claude 就照这套规矩去 git diff 然后把提交信息写给你。这就是自定义命令的本质:把一段你老要手动敲的指令,固化成一键呼出

但这才是个「提示词」,还没成一个「工具」。让它升一个台阶的,是两点:能接参数、能自己收上下文。接下来逐个解锁。

三、参数不是摆设:$0 $1 和命名参数

一个命令能接输入,才叫工具。你敲 /commit 修复登录超时修复登录超时 这一段就进到了文件里,靠变量替换拿到。变量有三种写法,重点全在第一处:

写法 展开成什么
$ARGUMENTS 命令名后面你敲的整串,原样一个整体
$0 / $1 / $ARGUMENTS[0] [1] 按位置拆开的第 1 / 第 2 个参数
$name 在 frontmatter 里用 arguments: 声明的命名参数

注意,这里有个坑过无数人的地方:$0 才是第一个参数,$1 是第二个。 这跟 shell 脚本里 $1 是第一个的习惯正好反过来了。网上大量老文章还写着 $1 是第一个,直接照抄的全都错位了一位。带空格的参数要用引号包住,比如 /scaffold "user card" components,那么 $0 = user card$1 = components

想彻底躲开「第几个」这个计数坑,最稳的是用命名参数。在 frontmatter 里声明顺序,正文直接引用:

1
2
3
4
5
6
---
description: 修复一个失败的测试
arguments: [testfile]
argument-hint: [测试文件路径]
---
修复 `$testfile` 这个测试。

arguments: [issue, branch] 就对应 $issue(第一个)、$branch(第二个),谁也不会数错。同理,$ARGUMENTS 会展开成整段输入;哪怕你在正文里忘了写 $ARGUMENTS,Claude Code 也会自动把它追加成 ARGUMENTS: 你敲的内容,保证输入不丢。

四、! 反引号块:让命令自己去收上下文

光靠提示词,Claude 还得自己 git diff、自己 git log,慢还容易漏。真正让命令「活起来」的一招,是**! 加反引号包一行 shell 命令**——它会在提示词送出去之前先把这条命令跑一遍,把命令的 stdout 直接嵌进提示词里。命令自己把上下文喂给自己。

/commit 升级一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
---
description: 按暂存区的改动写提交信息
disable-model-invocation: true
model: haiku
---
暂存的改动:
!`git diff --cached`

最近几次提交的风格参考:
!`git log --oneline -10`

写一条 Conventional Commits 提交信息,主题 72 字符以内,
只有改动需要解释时才写正文。只输出提交信息,别加解释和代码块。

你敲一下 /commit,先跑 git diff --cached 把暂存内容贴进来,再跑 git log 把风格贴进来,然后 Claude 才照着写。这条命令从此不再依赖「Claude 自己去猜」——上下文是命令自己在调用前抓好的。这一句 !,就是「存起来的提示词」变成「工具」的分水岭。

五、frontmatter 里几个真正有用的旋钮

命令文件顶部可以加一段 YAML,控制它的行为。你不用全记,挑这几个真正值钱的:

1
2
3
4
5
6
7
8
9
---
description: 按改动写提交信息
argument-hint: [可选说明]
arguments: [note]
allowed-tools: Bash(git diff *), Bash(git log *)
disallowed-tools: Edit, Write
model: haiku
disable-model-invocation: true
---

逐个说人话:

  • description:命令列表里显示的一行说明。不写的话会拿正文第一行凑数,基本没法看。
  • argument-hint:输入框的占位提示,纯装饰但能告诉别人该传什么。
  • model:给这条命令单独指定模型。像写提交信息这种机械活用 haiku 就够,能省不少;改完这一轮自动恢复会话原模型。
  • allowed-tools预先授权列出的工具,让它运行时不用弹权限确认。注意它是「放行」,不是「限制」——没列的工具仍然按你平时的权限规则能调用。想真正「收窄」,得用 disallowed-tools 把某些工具摘掉。
  • disable-model-invocation: true只允许你手动敲 /名字 触发,Claude 不会自己把它调起来。凡是带副作用的命令(部署、提交、发消息)都该加上这个,否则 Claude 可能「觉得代码差不多了」就自己触发。它还有个附加好处:description 平时不进上下文,一堆手动命令挂着也不占 token。

一句话记牢:允许用 allowed-tools 放行,限制用 disallowed-tools 收紧——这俩方向别搞反,很多人搞反了,结果一个「只读」的 review 命令跑去改文件。

六、slash 命令 vs skills:到底怎么搭

这是上一篇文章留的尾巴,今天说清。很多人拿它俩当一回事,其实差别就一个词——触发方式

  • Slash Commands 是你主动敲。你判断「此刻该跑了」,敲 /名字 手动触发。
  • Skills 是 Claude 自动匹配。description 常驻上下文,Claude 判断「对上了」就自己加载。

所以一句话定位:skills 管「可预测、高频、自动」;slash 命令管「你要掌控、按需、带判断」的活

而且到 2026 年这俩的身体已经合并了:.claude/commands/name.md.claude/skills/name/SKILL.md 都能生成 /name,旧命令文件照常工作,只是新特性都往 skills 那边走。同名时 skill 优先。所以:

  • 就想存个快捷提示词.claude/commands/ 一个文件就够,轻。
  • 要带辅助文件、要自动触发、要更细的调用控制.claude/skills/ 目录版,重但功能全。

实战里最常见的组合拳是:先写个 slash 命令手动跑顺,验证流程没问题了,再「毕业」成 skill 让它自动触发;而带副作用、必须你拍板的那批(/deploy /commit /发消息),永远留在 slash 命令 + disable-model-invocation: true,牢牢攥在自己手里。

到这儿三件套就齐了,收个尾:Subagents 是「再雇个人」、Skills 是「翻出说明书照着做」、Slash Commands 是「贴在你键盘上的快捷键」。 人 / 说明书 / 快捷键,三种粒度覆盖从「大块任务」到「一句话」的全部需求。

七、踩坑清单:替你趟过的这几个

  1. $1 不是第一个:再说一遍,$0 才是第一个。写命令前先在心里默念「零基、零基」。拿不准就上 arguments: [foo] + $foo 命名参数。
  2. allowed-tools 不拦人:它只放行不限制。要「只读」就再补 disallowed-tools: Edit, Write
  3. 带副作用的命令忘了 disable-model-invocation:结果 Claude 自己跑去部署了。部署、提交、发消息这类,一律加上。
  4. 文件名决定命令名:命令名看的是目录/文件名,不是 frontmatter 里的 namecommit.md 出的是 /commit
  5. 密钥别写进命令体.claude/commands/ 是要进 git 的。API Key 放环境变量,在命令里用 Bash 去引用,别明文塞提示词里。
  6. 命令越写越长:一个命令如果翻倍地涨,那它其实是「长错位置的 skill」,该带着辅助文件搬家去 .claude/skills/ 了。

到这里,「Claude Code 三零件」这条线就完整走完了:Subagents 拆活、Skills 复用、Slash Commands 一键触发。把上面这张 /commit 先跑通,体会一下「敲一下、上下文自动喂进来」的爽感。

生命不息,折腾不止。下一篇我们换条线,开 AI Agent 框架对比系列——把 LangGraph、Microsoft Agent Framework 和 Claude Code 这几套摆在台面上,比架构、比上手成本、比各自适合什么场景,帮你在「自建 vs 现成」里拿个准主意。先把这条 /commit 存进你的 .claude/commands/,咱们下一篇见。