Skip to content

用 cat、grep 看文件也会加载嵌套 CLAUDE.md 了:路径规则漏加载修复 ​

很多项目不止一个 CLAUDE.md:根目录一份写全局约定,frontend/、services/payment/ 这些子目录里再各放一份,写只对那块代码有效的规矩。还有一类是路径限定的规则,只在 Claude 碰到某些路径的文件时才生效。

这套机制有个前提:Claude 得「看到」那个目录下的文件,对应的规则才会被加载进来。CLI 2.1.293 修掉了这里的一个漏洞。

以前漏在哪 ​

Claude 查看文件有两条路:

  1. 用 Read 工具读文件,这是正规路径,会触发嵌套 CLAUDE.md 和路径规则的加载。
  2. 在 Bash 工具里直接敲命令看,比如 cat src/pay/api.ts、head -50 config.yaml、sed -n '10,40p' main.go、grep -n TODO utils.py。

问题出在第二条:用 cat、head、tail、sed -n 或 grep 查看单个文件时,那个文件所在目录的嵌套 CLAUDE.md、以及匹配它的路径规则,不会被加载。

结果就是:你在 services/payment/CLAUDE.md 里写了「金额一律用整数分,不许用浮点」,Claude 用 cat 看完这个目录的代码后动手改,却完全不知道这条规矩。

2.1.293 之后 ​

现在 Claude 通过 Bash 用上述命令查看单个文件,也会像 Read 工具一样,加载对应的路径规则和嵌套 CLAUDE.md。

注意 changelog 的措辞是单个文件的 cat、head、tail、sed -n、grep。像 grep -r 扫整个目录、或者一条命令里串好几个文件的情况,不要默认它们也会触发同样的加载。

升级后建议做的事 ​

  • 重新审视子目录里的规则。以前有些规矩「好像没生效」,可能就是这个原因。升级后它们会开始起作用,留意有没有过时或互相冲突的条目。
  • 重要的约束不要只靠嵌套文件。真正不能违反的规则(比如禁止改某些文件),更可靠的做法是用 hooks 或权限设置兜底。两者怎么分工,见站内 CLAUDE.md 和 hooks 怎么选。
  • CLAUDE.md 写法本身可以参考 CLAUDE.md 约束写法,规则写得具体,加载上了才有用。

同版本另一个和 Bash 有关的变化 ​

2.1.293 还改了 Bash 编辑差异提示的措辞:现在会说明列出的文件是在命令运行期间发生了变化,其中可能包括其他进程写入的改动。如果你看到一个命令「改了」你没预料到的文件,先想想是不是别的进程(比如 watcher、格式化工具)在同时写。

小结 ​

  • 以前 Claude 用 Bash 的 cat/head/tail/sed -n/grep 看单个文件,嵌套 CLAUDE.md 和路径规则不会加载。
  • 2.1.293 修复后,这些方式也会触发加载,和 Read 工具一致。
  • 升级后检查一遍子目录规则;硬约束仍建议用 hooks 或权限兜底。

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