Claude Code Hooks 入门:3 个实用自动化案例

Claude Code 写完代码格式乱七八糟?不小心改到 .env 导致 API Key 被覆盖?本文通过三个实战案例,教你用 hooks 实现自动化日志记录、代码格式化和敏感文件保护。

一、Hook 是什么?

Hook 就是一个「自动触发的机关」。就像便利店的自动门,你走过去它就开了,不用按按钮。

Claude Code 每次执行动作前后都会经过检查点。你在检查点设置了 hook,指定的命令就会自动运行。

本文用到两种 hook:

Hook 类型 触发时机 典型用途
PreToolUse 动作执行之前 检查、拦截、记录
PostToolUse 动作执行之后 格式化、测试、通知

二、案例一:记录指令日志

把 Claude Code 执行的每一条 Bash 指令自动记录下来,方便事后审查。

步骤一:打开 hook 设置

在 Claude Code 中输入:

Claude Code
/hooks

在弹出的设置界面中,选择 PreToolUse(动作执行之前触发)。

步骤二:设置 Matcher

点选「Add new matcher」,输入:

Matcher
Bash

这表示只监听 Bash 指令,其他工具不触发。

步骤三:写入 hook 指令

点选「Add new hook」,输入:

Bash
jq -r '"\(.tool_input.command)"' >> ~/claude-command-log.txt

jq 从 Claude Code 传来的 JSON 数据中提取指令内容,>> 追加写入日志文件。如果没装 jq,Mac 用 brew install jq,Linux 用 sudo apt install jq

步骤四:保存并测试

选择 User settings(全局生效),按 Esc 退出。让 Claude 执行任意指令后,查看日志:

Bash
cat ~/claude-command-log.txt

刚刚执行的指令已经被自动记录下来了。

三、案例二:自动格式化代码

让 Claude Code 改完 TypeScript 文件后,自动运行 Prettier 格式化,不用再手动处理。

前提:确保项目中已安装 Prettier:

Bash
pnpm add -D -E prettier

Hook 配置

输入 /hooks,这次选择 PostToolUse(文件改完之后触发)。

Matcher 输入:

Matcher
Edit|Write

表示「编辑文件」或「创建文件」时都触发。竖线 | 是「或」的意思。

Hook 指令输入:

Bash
jq -r '.tool_input.file_path' | { read file_path; if echo "$file_path" | grep -q '\.ts$'; then npx prettier --write "$file_path"; fi; }

逻辑拆解:

  • jq -r '.tool_input.file_path' — 从 JSON 中提取被修改的文件路径
  • read file_path — 存入变量
  • grep -q '\.ts$' — 检查是否为 .ts 文件(静默模式,只判断是否匹配)
  • npx prettier --write — 如果是 TypeScript 文件,执行格式化

保存后让 Claude 创建一个格式混乱的 .ts 文件,你会看到文件被自动格式化。

四、案例三:保护敏感文件

这个最重要。如果你有用 .env 存 API Key,这个 hook 一定要设。像 .envpackage-lock.json.git/ 这些文件,绝对不能让 Claude 随意修改。

核心概念:退出码

PreToolUse hook 靠退出码决定是否放行:

退出码 含义
0 允许执行
2 阻拦执行

Hook 配置

输入 /hooks,选择 PreToolUse,Matcher 输入 Edit|Write

Hook 指令输入以下 Python 脚本:

Python
python3 -c "
import json, sys
data = json.load(sys.stdin)
path = data.get('tool_input', {}).get('file_path', '')
blocked = ['.env', 'package-lock.json', '.git/']
if any(p in path for p in blocked):
    print('This file is protected!')
    sys.exit(2)
"

逻辑拆解:

  • json.load(sys.stdin) — 读取 Claude Code 传来的 JSON
  • data.get(...).get('file_path') — 提取目标文件路径
  • blocked = [...] — 黑名单列表
  • sys.exit(2) — 命中黑名单时,退出码 2 直接阻拦操作

保存后尝试让 Claude 修改 .env 文件,操作会被直接拦截。

五、总结

案例 Hook 类型 Matcher 功能
指令日志 PreToolUse Bash 自动记录所有 Bash 指令
代码格式化 PostToolUse Edit|Write TypeScript 文件自动 Prettier
敏感文件保护 PreToolUse Edit|Write 拦截对 .env 等文件的修改

Hook 能做的远不止这些 — 自动跑测试、发送通知、串接 CI/CD 都可以。现在就打开 Claude Code,输入 /hooks,比你想的简单。