什么是 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 下也会拦截;但插件形式的 mod 在某些情况下可以推翻)。经典用例:编辑后自动格式化(PostToolUse + Edit|Write)、保护关键文件、拦住危险命令、重新注入上下文(SessionStart)、通知/审计日志、停止前先测试(Stop)。安全方面,钩子以你的权限运行任意 shell 命令,故只配置可信的钩子并校验/加引号处理输入;在交互式会话中,信任该文件夹之前设置文件里的钩子不会运行(一项安全特性),而直接修改设置文件通常会自动生效。基于官方文档,以经典的 9 个事件和输入/输出约定为锚点。