ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Claude Code 一用 Bash 就刷屏 hook 报错 node 找不到?Git Bash 的 PATH 里根本没有 node,把 settings 改到 TaoToken 后怎么排查

Claude Code 一用 Bash 就刷屏 hook 报错 node 找不到?Git Bash 的 PATH 里根本没有 node,把 settings 改到 TaoToken 后怎么排查 1. Windows 下 Claude Code 用 Bash 就刷 hook 报错node 找不到到底卡在哪如果你在 Windows 上装了 Claude Code又启用了带 hook 的插件比如 everything-claude-code、oh-my-claudecode 这类大概率会遇到一个很烦的现象每次 Claude Code 调用 Bash 工具执行命令终端就多刷一条PostToolUse:Bash hook error内容基本长这样PostToolUse:Bash hook error ⎿ Failed with non-blocking status code: /usr/bin/bash: line 1: node: command not found这条报错最迷惑人的地方在于它不阻塞任何东西。你的命令照样执行、结果照样返回工具本身没坏但错误一条接一条看着就像环境哪里烂了。很多人第一反应是「我明明装了 Node.js系统 PATH 里也有为什么 Claude Code 的 hook 说找不到 node」答案藏在执行链里。Claude Code 在 Windows 上执行 hook 时并不是直接调用 Windows 的cmd或 PowerShell而是 spawn 一个 Git Bash 子进程路径通常是/usr/bin/bash再由这个 bash 去解析 hook 命令。也就是说hook 命令里的node是在Git Bash 的 PATH里查找的而不是 Windows 系统环境变量里的 PATH。这两套 PATH 虽然有关联但并不总是同步。我实测下来最常见的三种情况会导致这个错第一种Node.js 装在了D:\Program Files (x86)\nodejs这种非默认盘符目录安装时勾了「Add to PATH」但那个 PATH 只写进了 Windows 系统变量Git Bash 启动时没继承到或者继承的是旧快照。第二种用 nvm-windows、fnm 这类版本管理器装的 nodenode.exe 实际在用户目录下的版本文件夹里系统 PATH 里只有一个 shim而 Git Bash 的 PATH 转换对这类路径处理不干净。第三种插件 hook 注册表里所有命令都以裸node开头没有用绝对路径一旦 bash 会话里解析不到 node26 个 hook 就集体报错。这篇就按「先确认 Git Bash 自身 PATH 有没有 node → 再查 Claude Code 的 hook 配置和 settings 环境变量传递 → 最后把 settings 统一到 TaoToken 通道后复现验证」这条线走一遍。适合已经装好 Claude Code、能跑通插件体系、但被 hook 报错刷屏的 Windows 用户。读完你能拿到可复制的 settings 片段、PATH 检查命令以及一套能自己排查同类问题比如python3 not found、git not found的方法。2. 先确认 Git Bash 自身 PATH 里到底有没有 node排查任何「命令找不到」的问题第一步永远是回到那个报错的环境里亲手敲一遍查找命令。不要看 Windows 系统属性里的 PATH那个不算数。打开 Git Bash不是 PowerShell不是 cmd执行which node如果输出类似下面这样说明 bash 会话里确实解析不到 nodewhich: no node in (/c/Users/你的用户名/bin:/mingw64/bin:/usr/local/bin:/usr/bin:/bin:/c/Windows/system32:/c/Windows)注意括号里那串就是当前 bash 的 PATH。接着把它完整打出来看echo $PATH | tr : \n用tr把冒号换成换行一行一个目录方便肉眼扫。你会看到类似/c/Users/你的用户名/bin /mingw64/bin /usr/local/bin /usr/bin /bin /c/Windows/system32 /c/Windows如果这里面没有 node 的安装目录比如/d/Program Files (x86)/nodejs那根因就确认了不是 hook 写错是 hook 的执行环境里根本没有 node。再补一刀确认 node.exe 到底装在哪。在 Git Bash 里可以这样找ls /d/Program Files (x86)/nodejs/node.exe或者用 Windows 侧的命令反查cmd //c where node//c是 Git Bash 里调用 cmd 的写法避免路径被 MSYS 转换。如果where node能输出D:\Program Files (x86)\nodejs\node.exe而which node在 bash 里却找不到那就百分百是 PATH 分离问题。这里有个旁证很能说明机制很多人的settings.local.json里statusLine一直正常因为它写的是绝对路径{ statusLine: { type: command, command: exec \/d/Program Files (x86)/nodejs/node\ \${plugin_dir}dist/index.js\ } }statusLine同样由 bash 执行但它用了/d/Program Files (x86)/nodejs/node这个绝对路径所以从来不报错。插件 hooks 用的是裸node于是炸了。这正好印证只要走 bash 执行、又要调 node 的地方都必须自己解决 node 的解析问题。确认完这一步你就能排除「node 没装」这种误判把注意力集中到 PATH 和 hook 配置上。3. 检查 hook 配置与 settings 环境变量传递并统一到 TaoToken 通道确认 bash PATH 缺 node 之后别急着改先把 hook 配置的层级理清楚。Claude Code 的 hook 可能来自三个地方逐层排查第一层项目配置项目\.claude\settings.json。打开看有没有hooks字段以及命令里是不是以裸node开头。第二层用户全局配置C:\Users\用户名\.claude\settings.json。同样看hooks。第三层插件注册表。这是最容易被忽略的路径一般在C:\Users\用户名\.claude\plugins\marketplaces\插件名\hooks\hooks.json打开后你会看到类似这样的注册{ matcher: Bash, hooks: [ { type: command, command: node -e \const prequire(path);...\ node scripts/hooks/post-bash-dispatcher.js, async: true, timeout: 30 } ] }问题一目了然命令以裸node开头。如果插件里有几十个 hook全都是这个写法那 bash 一旦解析不到 node就会集体报错。接下来是这篇的重点之一把 Claude Code 的模型通道统一到 TaoToken同时把环境变量传递方式理顺。TaoToken 提供统一的 API 入口Base URL 是https://taotoken.net/api你需要在 settings 里显式声明环境变量让 Claude Code 走这个通道。在C:\Users\用户名\.claude\settings.json里可以这样写把 Key 换成你自己的{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: sk-你的TaoToken密钥, ANTHROPIC_MODEL: claude-sonnet-4-5, PATH: /c/Users/你的用户名/bin:/usr/local/bin:/usr/bin:/bin:/d/Program Files (x86)/nodejs }, hooks: {} }这里有两个关键点。第一env里的PATH是给 hook 子进程用的。Claude Code 在 spawn bash 执行 hook 时会把env里的变量注入进去。你在PATH里显式加上 node 的安装目录用 Git Bash 的 POSIX 写法/d/Program Files (x86)/nodejshook 就能解析到 node 了。这比改系统环境变量更精准因为它只影响 Claude Code 自己的子进程不污染全局。第二ANTHROPIC_BASE_URL指向https://taotoken.net/apiANTHROPIC_AUTH_TOKEN填 TaoToken 的 KeyANTHROPIC_MODEL指定模型 ID。这样 Claude Code 的请求统一走 TaoToken 通道和 hook 的 PATH 修复互不干扰。如果你用的是 Cline MCP 或 Codex 这类工具配置思路一样三件套必须写全Base URL、Key、Model ID。以 Codex 的auth.json为例路径通常在C:\Users\用户名\.codex\auth.json{ OPENAI_BASE_URL: https://taotoken.net/api, OPENAI_API_KEY: sk-你的TaoToken密钥, OPENAI_MODEL: gpt-5-codex }注意https://taotoken.net/api这个地址不带任何查询参数是纯 API 入口。如果你要拿 Key去控制台的 API Keys 页面生成要看接入文档去文档页对照参数。这两个入口在下面 CTA 里会给。配置改完后Claude Code 需要重新读取 settings。最稳的做法是退出当前会话重开或者执行一次/config让它重载。改完先别急着跑复杂命令用一条最简单的ls触发 PostToolUse hook看还报不报错。4. 验证请求与 hook 是否真的修好配置改完进入验证环节。分三步从 node 解析到 hook 触发再到模型请求逐层确认。第一步验证 bash 会话里 node 可解析。在 Git Bash 里执行node -v预期输出类似v24.15.0如果还是command not found说明env.PATH没生效检查 settings.json 的 JSON 格式有没有写错比如多了逗号、引号没闭合。第二步验证 hook 不再报错。在 Claude Code 会话里随便跑一条 Bash 命令ls预期结果是命令正常返回终端不再出现PostToolUse:Bash hook error。如果还报回到第 3 节确认插件 hooks.json 里的命令是不是裸node以及env.PATH里 node 目录拼写是否正确。第三步验证 TaoToken 通道的模型请求。在 Claude Code 里发一句简单对话比如「用一句话解释什么是 hook」。如果模型正常回复说明ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN配置正确。你也可以用 curl 直接测 API 入口curl -s https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的TaoToken密钥 \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-5, max_tokens: 64, messages: [{role: user, content: ping}] }预期返回一段 JSON包含content字段。如果返回 401说明 Key 不对如果返回 404检查 Base URL 是不是写成了带/v1的完整路径TaoToken 的入口是https://taotoken.net/api具体路径按文档拼。验证通过后再回到那个刷屏的场景连续跑几条 Bash 命令观察终端。正常情况下hook 静默执行不再刷错误。这时候你才算真正把「Git Bash PATH 缺 node」和「TaoToken 通道」两件事都理顺了。5. 本篇常见报错对照与排查清单排障最怕的是看到报错不知道往哪查。下面这张表把 Windows Git Bash Claude Code hook 场景下的高频报错和对应处理列出来你可以直接对照。报错信息常见原因处理方式/usr/bin/bash: line 1: node: command not foundbash PATH 无 node 安装目录在 settings 的env.PATH里加 node 目录或做符号链接 shim/usr/bin/bash: line 1: git: command not foundbash PATH 无 git或 PATH 转换异常检查 Git 安装确认/usr/bin在 PATH 里/bin/sh: 1: node: not foundhook 走/bin/shnode 由 nvm/fnm 管理用绝对路径注册 hook或写 wrapper 脚本401 UnauthorizedTaoToken Key 错误或未传检查ANTHROPIC_AUTH_TOKEN重新生成 Keylocal proxy failed本地代理配置冲突检查是否有残留代理环境变量清掉后重试reading choices相关报错响应格式与预期不符确认 Base URL 和模型 ID 匹配别混用不同厂商的字段OAuth相关报错认证方式冲突统一用 API Key 方式别同时开 OAuth关于符号链接 shim 这个方案补充一下。如果你不想改 settings 的env.PATH也可以在 Git Bash 里做一条软链mkdir -p ~/bin ln -sf /d/Program Files (x86)/nodejs/node.exe ~/bin/node~/bin在 Git Bash 的 PATH 里通常排第一位且是用户目录不需要管理员权限。做完后which node应该能输出/c/Users/你的用户名/bin/node。这个方案的好处是插件更新不会冲掉修复node 升级换目录也只需重新ln -sf一次。排查顺序建议固定成先看报错是不是line 1是的话问题在 hook 命令本身不是脚本内部→ 逐层找「命令以裸 node 开头」的注册项目 settings → 用户 settings → 插件 hooks.json→which node确认 bash 会话能否解析 → 定位 node.exe 真实路径 → 用env.PATH或 shim 修复。还有一个容易踩的坑改完 settings.json 后没重启 Claude Code。env变量是在会话启动时注入的热改不一定生效。养成改完配置就重开会话的习惯能省掉很多「明明改了却没效果」的困惑。6. 把通道和 PATH 一次配好后续少折腾走到这里你应该已经能让 hook 安静下来同时 Claude Code 的请求也走在了 TaoToken 统一通道上。回头看不难发现这类问题的本质不是「环境坏了」而是 Windows 上 Git Bash 的 PATH 和系统 PATH 是两套东西而 Claude Code 的 hook 恰好跑在前者里。我的建议是把env.PATH和 TaoToken 的三件套Base URL、Key、Model ID一次性写进用户级 settings.json而不是每个项目单独配。这样无论你在哪个目录开 Claude Codehook 都能解析到 node模型请求也走同一个通道不用反复调。如果你还没生成 Key去控制台的 API Keys 页面建一个接入参数对照文档页的说明填别凭记忆写路径。长期做编码和 Agent 任务的话Coding Plan 那条线也值得看一眼通道稳定了hook 和模型请求才不会互相拖后腿。最后留一个实用习惯每次装新插件后先跑一条ls看 hook 报不报错再跑一句对话看模型通不通。两步都过再开始正式干活。这样能把环境问题挡在开工之前而不是写到一半被刷屏打断。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进