Claude Code 写完代码格式乱七八糟?不小心改到 .env 导致 API Key 被覆盖?本文通过三个实战案例,教你用 hooks 实现自动化日志记录、代码格式化和敏感文件保护。
一、Hook 是什么?
Hook 就是一个「自动触发的机关」。就像便利店的自动门,你走过去它就开了,不用按按钮。
Claude Code 每次执行动作前后都会经过检查点。你在检查点设置了 hook,指定的命令就会自动运行。
本文用到两种 hook:
| Hook 类型 | 触发时机 | 典型用途 |
|---|---|---|
| PreToolUse | 动作执行之前 | 检查、拦截、记录 |
| PostToolUse | 动作执行之后 | 格式化、测试、通知 |
二、案例一:记录指令日志
把 Claude Code 执行的每一条 Bash 指令自动记录下来,方便事后审查。
步骤一:打开 hook 设置
在 Claude Code 中输入:
/hooks在弹出的设置界面中,选择 PreToolUse(动作执行之前触发)。
步骤二:设置 Matcher
点选「Add new matcher」,输入:
Bash这表示只监听 Bash 指令,其他工具不触发。
步骤三:写入 hook 指令
点选「Add new hook」,输入:
jq -r '"\(.tool_input.command)"' >> ~/claude-command-log.txtjq 从 Claude Code 传来的 JSON 数据中提取指令内容,>> 追加写入日志文件。如果没装 jq,Mac 用 brew install jq,Linux 用 sudo apt install jq。
步骤四:保存并测试
选择 User settings(全局生效),按 Esc 退出。让 Claude 执行任意指令后,查看日志:
cat ~/claude-command-log.txt刚刚执行的指令已经被自动记录下来了。
三、案例二:自动格式化代码
让 Claude Code 改完 TypeScript 文件后,自动运行 Prettier 格式化,不用再手动处理。
前提:确保项目中已安装 Prettier:
pnpm add -D -E prettierHook 配置
输入 /hooks,这次选择 PostToolUse(文件改完之后触发)。
Matcher 输入:
Edit|Write表示「编辑文件」或「创建文件」时都触发。竖线 | 是「或」的意思。
Hook 指令输入:
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 一定要设。像 .env、package-lock.json、.git/ 这些文件,绝对不能让 Claude 随意修改。
核心概念:退出码
PreToolUse hook 靠退出码决定是否放行:
| 退出码 | 含义 |
|---|---|
| 0 | 允许执行 |
| 2 | 阻拦执行 |
Hook 配置
输入 /hooks,选择 PreToolUse,Matcher 输入 Edit|Write。
Hook 指令输入以下 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,比你想的简单。