☰
Claude Code 一用 Bash 就刷屏 hook 报错 node 找不到?Git Bash 的 PATH 里根本没有 node,把 settings 改到 TaoToken 后怎么排查
2026/10/9 19:49:55 网站建设 项目流程

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 这类版本管理器装的 node,node.exe 实际在用户目录下的版本文件夹里,系统 PATH 里只有一个 shim,而 Git Bash 的 PATH 转换对这类路径处理不干净。

第三种,插件 hook 注册表里所有命令都以裸node开头,没有用绝对路径,一旦 bash 会话里解析不到 node,26 个 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 会话里确实解析不到 node:

which: 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 p=require('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)/nodejs),hook 就能解析到 node 了。这比改系统环境变量更精准,因为它只影响 Claude Code 自己的子进程,不污染全局。

第二,ANTHROPIC_BASE_URL指向https://taotoken.net/api,ANTHROPIC_AUTH_TOKEN填 TaoToken 的 Key,ANTHROPIC_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/sh,node 由 nvm/fnm 管理用绝对路径注册 hook,或写 wrapper 脚本
401 UnauthorizedTaoToken Key 错误或未传检查ANTHROPIC_AUTH_TOKEN,重新生成 Key
local 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 Code,hook 都能解析到 node,模型请求也走同一个通道,不用反复调。

如果你还没生成 Key,去控制台的 API Keys 页面建一个;接入参数对照文档页的说明填,别凭记忆写路径。长期做编码和 Agent 任务的话,Coding Plan 那条线也值得看一眼,通道稳定了,hook 和模型请求才不会互相拖后腿。

最后留一个实用习惯:每次装新插件后,先跑一条ls看 hook 报不报错,再跑一句对话看模型通不通。两步都过,再开始正式干活。这样能把环境问题挡在开工之前,而不是写到一半被刷屏打断。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询