首页 › Claude Code › 钩子
概览安装CLI 参考文档定价与限制Agent SDK技能与插件GitHub网页、桌面与 IDE模型错误是否开源?教程学生指南QA 自动化与 Cursor 对比与 Codex 和 OpenCode 对比子智能体钩子MCP生态系统VS CodeOpenRouter速率限制中文指南
最后更新:2026 年 11 月

Claude Code 钩子:以确定性方式控制智能体的行为

钩子是 Claude Code 在其循环的固定节点运行的 shell 命令,例如工具调用前、工具调用后、提交提示词时以及任务完成时。模型可能遵循也可能不遵循 CLAUDE.md 中的指令,而钩子始终会运行。通过钩子,你可以制定始终生效的规则。

TLDR

  • 配置位置: .claude/settings.json (项目级)或 ~/.claude/settings.json (用户级),也可以使用 /hooks.
  • 事件:PreToolUse、PostToolUse、UserPromptSubmit、Notification、Stop、SubagentStop、PreCompact、SessionStart。
  • 钩子通过标准输入接收 JSON(工具名称、输入、会话);退出码 0 表示允许,退出码 2 表示阻止,并将标准错误输出反馈给 Claude。
  • 典型用途:每次编辑后格式化、阻止危险命令、要求停止前通过测试、发送桌面通知。

钩子的组成

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

包含三个部分:事件、匹配器(对于工具事件,它是匹配工具名称的正则表达式;省略则匹配所有工具)以及一个或多个命令。命令通过标准输入接收描述事件的 JSON 对象,对于工具事件,其中包含 tool_name 和 tool_input,上面的示例正是通过它找到刚编辑的文件。将配置放入 .claude/settings.json 即可在仓库中共享,放入 ~/.claude/settings.json 供自己使用,或者运行 /hooks 让 Claude Code 写入配置。

事件

  • PreToolUse — 在工具运行之前。这是唯一可以 阻止工具调用的事件:退出码 2 会取消调用,Claude 会读取你的标准错误输出作为原因。
  • PostToolUse — 在工具成功执行之后。可对编辑过的文件运行格式化工具、代码检查工具和类型检查。
  • UserPromptSubmit — 在你发送提示词时;可以注入上下文或拒绝提示词。
  • Stop / SubagentStop — 在智能体(或子智能体)即将结束时。此处退出码 2 表示“尚未完成”,经典用法是在测试失败时拒绝停止。
  • PreCompact — 在执行 /compact之前;保存完整对话记录中你需要的任何内容。
  • SessionStart — 在会话开始或恢复时;加载环境、输出提醒。
  • Notification — 在 Claude Code 需要你关注时(权限提示、空闲状态);可将其接入桌面通知或 Slack 通知。

阻止危险命令

#!/usr/bin/env bash
# .claude/hooks/guard.sh  -- PreToolUse, matcher: Bash
cmd=$(jq -r '.tool_input.command')
if echo "$cmd" | grep -Eq 'rm -rf|git push --force|DROP TABLE|--no-verify'; then
  echo "blocked by guard.sh: $cmd" >&2
  exit 2
fi
exit 0

退出码 2 是约定:工具调用不会执行,钩子输出到标准错误的内容会成为 Claude 看到的说明,让它能够选择其他方法,而不是重试同一操作。其他任何非零退出码都会被记录,但不会阻止调用。

“测试通过之前不要停止”

#!/usr/bin/env bash
# Stop hook: refuse to finish while the suite is red
if ! npm test --silent >/tmp/claude-test.log 2>&1; then
  echo "Tests are failing; fix them before finishing:" >&2
  tail -n 40 /tmp/claude-test.log >&2
  exit 2
fi

在无界面运行时,将其与 --max-turns 上限配合使用,避免确实无法修复的失败导致无限循环。

钩子、CLAUDE.md 与权限的对比

CLAUDE.md 是模型读取的建议; /permissions 列出了它无需询问即可执行的操作;钩子则是无论如何都会运行的代码。用 CLAUDE.md 提供风格要求和上下文,用权限界定允许直接执行和需要询问的范围,用钩子保证每次都必须满足的要求,例如格式化、密钥扫描、测试门禁和审计日志。它们可以组合使用:权限允许 Bash(git *) 运行,PreToolUse 钩子仍然可以阻止 git push --force.

钩子与网关

钩子在本地运行,完全不涉及 API,因此当 Claude Code 指向 ANTHROPIC_BASE_URL=https://aiprimetech.io时,无需更改。一个实用的组合是:使用 Stop 钩子,从你自己的日志中输出 /cost风格的用量信息,让使用按量付费额度的团队在每次会话结束时看到该会话的费用。

先免费试用

新账户可获得 $5 免费 API 额度 使用优惠码 CLAUDECODE — 足够用 Sonnet 运行 Claude Code 一晚,之后可获得面值 7.69231 倍的额度。

export ANTHROPIC_BASE_URL=https://aiprimetech.io
export ANTHROPIC_API_KEY=your_key

使用优惠码 CLAUDECODE 创建账户

常见问题

什么是 Claude Code 钩子?

它们是 Claude Code 在循环中的各类事件发生时自动运行的 shell 命令,例如工具调用前后、提交提示词时以及停止时。与 CLAUDE.md 中的指令不同,它们的执行是确定的。

如何用钩子阻止命令?

使用匹配器为 Bash 的 PreToolUse 钩子,从标准输入中检查 tool_input.command,并以退出码 2 退出;标准错误文本会作为原因显示给 Claude。

钩子应放在哪里?

放在项目中的 .claude/settings.json(共享)或 ~/.claude/settings.json(个人)的 hooks 键下;可通过 /hooks 交互式编辑。

通过网关运行 Claude Code

相同的模型,两个环境变量,面值 7.69231 倍的额度,或固定费率不限量方案。 新账户:使用优惠码 CLAUDECODE 可获得 $5 免费 API 额度。

获取 API 密钥 查看不限量方案

AI Prime Tech 是独立的 API 网关,与 Anthropic 无关联,也未获得其认可或赞助。“Claude”和“Claude Code”是 Anthropic 的商标。此处介绍的 Claude Code 功能以撰写时 Anthropic 的公开文档为依据,且经常发生变化;本页面的价格和模型列表读取自此网关的实时设置。

更多 Claude Code 指南

Claude Code:完整指南如何安装 Claude CodeClaude Code CLI 文档:命令与参数Claude Code 定价与限制详解Claude Code SDK,现已更名为 Claude Agent SDKClaude Code 技能与插件在 GitHub 中使用 Claude Code:App、Action 和 @claudeClaude Code 有网页界面吗?网页、桌面与 IDE 版本详解Claude Code 使用哪个模型,以及如何更改Claude Code 错误及修复方法Claude Code 开源吗?Claude Code 教程:您的首次实际会话学生使用 Claude:Claude Code、API,以及教育优惠实际提供什么如何使用 Claude Code 实现 QA 自动化Claude Code 与 Cursor 对比:如何选择、何时使用,以及如何同时使用两者Claude Code、Codex 与 OpenCode:终端智能体对比Claude Code 子智能体:工作原理、定义方法与智能体团队Claude Code MCP:连接服务器、作用域、远程 MCP 与实际示例Claude Code 生态系统:路由器、框架、插件及收录它们的清单在 VS Code 中使用 Claude Code:扩展、终端方式与常见错误如何在 Claude Code 中使用 OpenRouter(以及何时不宜使用)Claude 速率限制错误:“API error: rate limit reached”的含义与解决方法Claude Code 怎么用:从安装到日常使用