一、一句话摘要
二、为什么需要环境变量持久化
Hook 进程之间没有共享内存。SessionStart Hook 检测到项目使用 pnpm,PreToolUse Hook 需要据此拦截 npm install 命令——两个独立进程,前者退出后所有局部变量消失,后者无从得知检测结果。
$CLAUDE_ENV_FILE 解决的就是跨 Hook 进程的信息传递问题。
三、核心内容
内置环境变量的可用范围
每个 Hook 脚本启动时,Claude Code 自动注入一组环境变量,无需配置:
这两个是 command 类型 Hook 脚本中最常用的变量。CLAUDE_PROJECT_DIR 确定项目位置,CLAUDE_ENV_FILE 确定写入目标。
Hook 同时通过 stdin 接收 JSON 输入,包含更丰富的上下文:
在 SubAgent 内运行时,JSON 输入额外包含 agent_id 和 agent_type 两个字段。
持久化与共享规则
写入格式:$CLAUDE_ENV_FILE 要求 Shell export 语句,不是 .env 格式的纯键值对。
格式要求的原因:Claude Code 在执行每次 Bash 命令前 source 这个文件。source 执行的是 Shell 脚本语法,只有 export 语句才能将变量导出到子进程环境。