跳到主内容

Claude Code Hooks 用法详解:让 AI 编程智能体自动执行你的规则

100%
Claude Code Hooks 用法详解:让 AI 编程智能体自动执行你的规则

Claude Code Hooks 用法:一句话讲清它解决什么问题

Claude Code Hooks 用法一句话概括:它是你在 settings.json 里注册的自定义 shell 命令,Claude Code 在生命周期的关键节点(写文件前、跑完命令后、会话结束时)自动执行,从而把「格式化、通知、拦截危险操作」这类规则变成确定性保障,而不是祈祷模型每次都记得。据 Anthropic 官方文档的说法,Hooks 的核心价值是「 deterministic control 」——某些动作一定会发生,不依赖 LLM 自觉。这和我们在 Claude Code 和 Cursor 区别里聊到的「工程化能力」一脉相承:终端智能体的可编程性,正是它和 IDE 型工具拉开差距的地方。

常用事件:PreToolUse 、 PostToolUse 、 Stop 、 UserPromptSubmit 各管一段

Claude Code 在会话的不同阶段触发不同事件,选对事件是写好 Hook 的第一步。最常用的四个如下:

  • PreToolUse:工具执行前触发,可以审查甚至拦截这次调用,比如阻止 rm -rf 、保护 .env 文件不被读取或改写。
  • PostToolUse:工具执行成功后触发,最适合做自动格式化、 lint 、记录变更日志。
  • Stop:Claude 完成一轮响应时触发,常用来跑一遍测试、校验任务是否真的完成,或推送完成通知。
  • UserPromptSubmit:你提交提示词后、 Claude 处理前触发,stdout 内容会注入上下文,适合自动附加项目约定、当前 git 分支等信息。

此外还有 SessionStart(会话启动注入环境)、 Notification(需要你确认时弹通知)、 PermissionRequest(自动批准重复性授权)等,完整列表可查官方 Hooks reference 。事件通过 stdin 收到一段 JSON(含 tool_name 、 tool_input 等字段),脚本用退出码反馈结果:0 表示放行,2 表示阻止并把 stderr 内容回传给 Claude 让它自行调整。

settings.json 配置示例:从格式化到拦截危险命令

配置写在 settings.json 的 hooks 字段下,结构是「事件名 → 数组 → matcher + 命令」。三个最实用的例子:

1. 编辑后自动格式化

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }
        ]
      }
    ]
  }
}

matcher 用 Edit|Write 限定只在编辑类工具调用后触发,不会在每次 Bash 调用后空跑。

2. 需要你确认时弹桌面通知

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "osascript -e 'display notification \"Claude Code 需要你的输入\" with title \"Claude Code\"'" }
        ]
      }
    ]
  }
}

挂后台跑长任务时特别有用,Linux 换成 notify-send,Windows 用 PowerShell 弹窗即可。

3. 拦截危险命令(PreToolUse + 退出码 2)

#!/bin/bash
INPUT=$(cat)
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
if echo "$CMD" | grep -qE 'rm -rf|git push --force'; then
  echo "Blocked: 危险命令被拦截:$CMD" >&2
  exit 2
fi
exit 0

脚本里也可以直接展示这段短代码语法给同事参考,但注意方括号要转义写成 [jinyu_tip type="info]警示内容[/jinyu_tip] 的形式,否则会被解析掉——这是本站编辑器的一个小坑。

Claude Code Hooks 用法的配置步骤与踩坑提醒


  1. 打开 ~/.claude/settings.json(全局生效)或项目根目录 .claude/settings.json(仅本项目,可提交仓库共享),在 hooks 字段下按上面的格式添加事件和命令。

  2. 在 Claude Code 里输入 /hooks 打开只读浏览器,确认新 Hook 已被识别,并核对其来源文件和命令内容。

  3. 实测触发一次:比如让 Claude 编辑一个文件,观察格式化是否自动执行;排查问题时用 claude –debug 启动查看 hook 日志。


几个高频坑:脚本依赖 jq,机器上没装会静默失败;PreToolUse 的退出码 0 只是「无异议」,不等于自动批准,自动批准要用 PermissionRequest 输出 JSON decision;Stop hook 连续阻止超过 8 次会被强制放行,脚本里应检查 stop_hook_active 字段避免死循环。

进阶玩法是把 Hook 和 MCP 工具联动,比如用 matcher 匹配 mcp__github__.* 审计所有 GitHub 工具调用,MCP Server 的搭建可以参考我们的 MCP Server 自己搭建教程。如果要做「模型评审代码再决定放行」这类带判断力的规则,prompt 类型的 Hook 或结合多智能体编排(见 多智能体怎么编排)会更合适。

常见问题


Hooks 和 CLAUDE.md 里的规则有什么区别?
CLAUDE.md 是「软约束」,模型可能遵守也可能忘掉;Hooks 是「硬约束」,由外部脚本确定性执行,无论模型怎么想,格式化一定跑、危险命令一定被拦。两者配合使用效果最好。

配置写在哪个文件里?作用范围有什么不同?
~/.claude/settings.json 对你所有项目生效;项目根目录 .claude/settings.json 只对该项目生效且可随仓库共享给团队;.claude/settings.local.json 仅本机本项目、不会提交。临时禁用全部 Hooks 可设 disableAllHooks 为 true 。

Hook 脚本报错会影响 Claude Code 正常工作吗?
退出码非 0 且非 2 属于非阻塞错误,动作默认继续执行,界面上会显示 hook error 提示,不会中断会话;只有退出码 2 才会真正阻止对应操作。

Windows 下能用 Hooks 吗?
可以,command 类型 Hook 在 Windows 上通过 Git Bash 等环境执行 shell 脚本,桌面通知改用 PowerShell 实现即可;官方文档也提示各平台都可以通过返回 systemMessage 向用户展示消息。

把团队里反复口头强调的规矩下沉成一两条 Hook,是上手 Claude Code 之后性价比最高的工程化投资。

这篇有帮助吗?
云上的幻象
云上的幻象查看主页

七彩云博客,分享 WordPress 建站实战与 AI 工具测评,覆盖服务器运维、站长工具、软件资源与电商运营干货,专注原创实用的主题插件、网站加速与安全优化教程。

752文章4评论

相关文章

评论 (0)

欢迎你,新朋友,感谢参与互动!文明发言,理性交流 · 首次评论将在审核后展示