什么是 Claude Code hooks?确定性地运行 shell 命令
Claude Code hooks 是用户定义的 shell 命令,在 Claude Code 生命周期的特定时点自动运行,让“必须始终发生”的事真正落地、确定性执行,而不依赖 LLM 的判断。经典事件有 9 个——SessionStart、UserPromptSubmit、PreToolUse、PostToolUse、Notification、Stop、SubagentStop、SessionEnd、PreCompact——其中 PreToolUse 等可拦截(阻止受保护文件编辑或危险命令)。你在 settings.json 的 “hooks” 键下以“事件名 → matcher → type + command”的形式配置。输入/输出约定:钩子从 stdin 接收 JSON(session_id、tool_input 等),并通过退出码 0(成功)/ 2(拦截,stderr 回传给 Claude)或结构化 JSON(continue、decision:block、permissionDecision: deny/allow/ask)返回。核心原则是“钩子可以收紧但不能放松限制”(deny 始终胜出,即便在 bypassPermissions 下也会拦截)。经典用例:编辑后自动格式化(PostToolUse + Edit|Write)、保护关键文件、拦住危险命令、重新注入上下文(SessionStart)、通知/审计日志、停止前先测试(Stop)。安全方面,钩子以你的权限运行任意 shell 命令,故只配置可信的钩子并校验/加引号处理输入;钩子配置在会话启动时被捕获固定(一项安全特性),因此会话中途的改动不会生效。基于官方文档,以经典的 9 个事件和输入/输出约定为锚点。