让 Claude 定时任务跳过项目钩子
作者在 Claude Code 2.1.314 中验证,使用 --setting-sources "" 可阻止加载设置文件中的钩子,同时保留订阅登录。文章还给出只读工具限制、严格 MCP 配置及超时包装方法。
AI 深度解读
让 claude -p 定时检查文件,限制它只能读取,还不一定够:项目配置里的 hook 可能照样执行。作者想做每周自动检查规则文件的任务,真正要解决的是两个条件同时成立:不触发项目 hook,也继续使用订阅账号登录。
作者在 Claude Code 2.1.314 上验证,关键参数是 --setting-sources ""。这篇短文的价值,不是一套复杂脚本,而是把配置来源、工具权限、登录方式和 macOS 脚本兼容性放到一起检查。
只允许读取,为什么还要管配置来源
作者的任务是每周执行四轮只读检查,分别查找规则冲突、过时条目、规则偏离和重复内容,再交给 launchd 每周一运行。
这里有两个不同的控制点:模型能调用什么工具,以及启动时会加载什么配置。限制前者,不能直接证明后者不会触发额外动作。
作者没有只看参数名称,而是设计了一个可观察的测试:
在临时目录的 .claude/settings.json 中设置一个 SessionStart hook,让它创建文件。运行 claude -p 后,检查文件是否出现。
Claude Code 2.1.314 上的结果是:
- 使用
--setting-sources ""时,hook 没有运行,订阅登录仍然有效,并且正常返回了回答。 - 使用
--setting-sources project时,hook 运行了。
限制模型读取文件,与阻止启动 hook 执行,是两件需要分别验证的事。
空字符串不能漏掉。作者传入的是 --setting-sources "",用来阻止加载设置文件,并非简单省略这个参数。
订阅登录和 macOS,让脚本多了几处约束
另一个容易选中的参数是 --bare。按作者的说明,它只读取 ANTHROPIC_API_KEY,不会使用 OAuth 或钥匙串,因此不适合作者依赖订阅登录的任务。这里的选择取决于认证方式,不能只看哪个参数显得更精简。
作者最终使用的参数组合为:
--tools Read,Grep,Glob --allowedTools Read,Grep,Glob --strict-mcp-config --setting-sources "" --no-session-persistence --output-format text
其中,--tools 和 --allowedTools 都指定 Read,Grep,Glob,将可用工具限制到读取、内容搜索和文件匹配。整组参数还包含 MCP 配置约束、不持久化会话以及文本输出设置。不过,原文没有逐项展示这些参数的独立测试,也没有展开 MCP 的具体配置。
macOS 脚本还有两处坑。作者指出系统没有现成的 timeout 命令,于是用 perl -e 'alarm shift; exec @ARGV' 包住调用;被这个超时机制终止的任务,脚本按退出码 142 识别。
另一处来自系统自带的 bash 3.2:当 heredoc 文本包含反引号时,把 heredoc 放进 $( ) 会遇到解析问题。作者改用 IFS= read -r -d '' PROMPT <<'EOF' || true 加载提示词。
原文提供的是一段用于生成脚本的提示词,集中写明了这些约束,并不是已经完成的 bash 脚本:
Write a bash script for macOS that runs claude -p headless and read-only. Use exactly these flags: --tools Read,Grep,Glob --allowedTools Read,Grep,Glob --strict-mcp-config --setting-sources "" --no-session-persistence --output-format text. Wrap the call in perl -e 'alarm shift; exec @ARGV' <SECONDS> and report exit code 142 as a timeout. Load the prompt with IFS= read -r -d '' PROMPT <<'EOF' || true, never a heredoc inside $( ), because bash 3.2 breaks on backticks there. Then give me a test: a temp folder whose .claude/settings.json has a SessionStart hook that touches a file, and a check that the file was not created.
要留意其中的 --setting-sources "",以及加载提示词的 read 写法;让 AI 生成脚本时,这些具体约束比一句「请写一个只读任务」更有用。
我的判断
我赞成作者先制造一个会留下痕迹的 hook,再观察参数是否生效。这比根据参数名称推断行为可靠,而且测试成本很低。
但结论有明确边界:作者展示的是 Claude Code 2.1.314、自己的订阅登录环境,以及一个 SessionStart hook 的测试。原文没有覆盖其他版本、其他 hook 类型,也没有给出完整脚本和运行日志,不能据此认定所有副作用都被排除了。
相较于只设置工具白名单,作者多验证了配置加载这条路径;相较于直接使用 --bare,作者保住了自己需要的订阅认证方式。文章没有性能、成本或可靠性的对照数据,这套组合应当看作经过局部实测的工程经验。
对于原文的四类规则检查,也不要混淆两种效果:任务能定时运行是一回事,能否准确识别冲突和过时条目又是另一回事。后者没有提供评估结果。
能拿来做什么
- 给前端或全栈项目安排规则文件巡检时,可以沿用冲突、过时条目、规则偏离和重复内容这四个检查方向,先让任务输出报告。
- 把
claude -p接入定时脚本前,先在临时目录放一个创建文件的SessionStarthook,验证当前版本使用--setting-sources ""后的实际表现。 - 使用订阅账号运行自动任务时,保留一次登录与回答验证;不要直接把作者明确不适用的
--bare加进参数组合。 - 在 macOS 上生成这类脚本时,把超时退出码
142、bash 3.2 的 heredoc 限制和完整参数交给 AI,并检查生成结果是否逐项落实。