在 Claude Code 操作前后自动运行 Shell 命令,实现自动化工作流。
什么是钩子(Hooks)
钩子是 Claude Code 在你执行某些操作前后自动运行的脚本。就像 Git 的钩子一样,它们让你插入自定义逻辑到 Claude Code 的工作流程中。
可用的钩子
| 钩子名称 | 触发时机 |
|---|---|
pre-command | Claude 运行任何命令之前 |
post-command | 命令执行之后 |
pre-tool-use | Claude 使用任何工具之前 |
post-tool-use | 工具使用之后 |
pre-turn | Claude 开始回复你之前 |
post-turn | Claude 完成回复之后 |
notification | Claude 发送通知时 |
user-message-submit | 你发送消息之前 |
配置钩子
在 .claude/settings.json 中配置
{
"permissions": {
"hooks": {
"pre-command": "echo '即将运行命令: $COMMAND'",
"post-command": "echo '命令完成: $STATUS'",
"pre-tool-use": "echo 'Claude 即将使用工具: $TOOL'",
"post-turn": "logger 'Claude 回复完成'"
}
}
}
环境变量
不同的钩子提供不同的环境变量:
$COMMAND— 即将运行的命令$STATUS— 命令的退出状态码$TOOL— 即将使用的工具名称$OUTPUT— 工具的输出
常见用途
1. 代码格式化
每次 Claude 编辑文件后自动格式化:
{
"permissions": {
"hooks": {
"post-tool-use": "if [ "$TOOL" = "Edit" ]; then ruff format .; fi"
}
}
}
2. Lint 检查
在 Claude 提交前自动运行 lint:
{
"permissions": {
"hooks": {
"pre-command": "if echo "$COMMAND" | grep -q 'commit'; then ruff check . || exit 1; fi"
}
}
}
3. 日志记录
记录每次 Claude 的操作:
{
"permissions": {
"hooks": {
"post-turn": "date +%Y-%m-%dT%H:%M:%S | xargs -I{} echo '{}' ' - Claude session ended'"
}
}
}
4. 安全审计
在 Claude 运行危险命令前拦截:
{
"permissions": {
"hooks": {
"pre-command": "if echo "$COMMAND" | grep -q 'rm -rf'; then echo '禁止删除操作'; exit 1; fi"
}
}
}
注意事项
- 钩子脚本应该是简短的:长时间运行的钩子会阻塞 Claude 的工作
- 钩子可以有多个命令:使用
&&连接多个操作 - 钩子可以拒绝操作:退出码非零时,操作会被取消
- 钩子中的敏感操作:确保钩子脚本不会泄露密钥或敏感信息