vscode中zx脚本报错主因是node环境、终端启动方式与文件权限错位;必须用node script.mjs或zx script.mjs执行,禁用code runner和launch.json直接运行,跨平台需统一路径、补全path、避免shebang依赖。

VSCode里用 zx 写脚本,报 Permission denied 或 command not found,基本不是 zx 本身的问题,而是 Node 环境、终端启动方式、文件权限三者错位导致的——尤其在跨平台(Windows/macOS/WSL)场景下,zx 的 $ 模板调用底层 shell,会直接暴露这些底层差异。
zx 脚本执行失败,先确认它是不是真被当 Node 脚本运行
zx 脚本本质是 Node.js 文件(.mjs 或 .js),必须由 node 解释器执行,不能靠 ./script.mjs 直接运行(除非你设了正确的 shebang 且 chmod +x 成功)。常见错误是误以为它是普通 Shell 脚本,结果 VSCode Code Runner 插件用 /bin/sh -c 去跑,立刻崩在 await $`ls` 语法上。
- 正确执行方式只有两种:
node script.mjs或zx script.mjs(需全局安装zx) - 别在
launch.json的program字段写"./script.mjs"—— 这会让 VSCode 调试器尝试用 shell 执行,而不是 Node - 如果用了
#!/usr/bin/env zx,必须确保zx在$PATH中,且文件有x权限;macOS/WSL 下还要验证head -n1 script.mjs | cat -A没 BOM 和空格
Windows 上 zx 报 “spawn bash ENOENT” 或 PowerShell 策略拦截
VSCode 默认终端是 PowerShell,而 zx 默认 spawn bash(即使你没装 Git for Windows 或 WSL)。它不走 PowerShell,所以 Set-ExecutionPolicy 对 zx 本身无效,但会影响它调用的子命令(比如你在脚本里 await $`npm run build`,而 npm 封装脚本是 .ps1)。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- Windows 原生环境:安装 Git for Windows 并勾选 “Use Windows’ default console window”,确保
bash可用;或改用zx --shell powershell显式指定 shell - PowerShell 策略问题只影响
.ps1脚本调用链,不是zx主进程问题;若await $`npm run dev`卡住,检查 npm 是否生成了 .ps1 封装器(npm config get script-shell) - 避免混合路径:脚本里别用
cd("C:\project"),用cd(path.resolve("project"))或cd(fileURLToPath(import.meta.url))保证跨平台路径兼容
WSL/macOS 下 zx 调用命令报 command not found
根本原因和普通 Shell 脚本一样:VSCode 终端没加载你的 shell 配置(~/.zshrc),导致 PATH 缺失。而 zx 启动的子进程继承的是该终端的环境变量,不是你手动打开 Terminal 里的完整 PATH。
- 验证方法:在 VSCode 终端运行
echo $PATH,对比原生 Terminal 输出;缺失项常见于~/.local/bin、~/.pyenv/shims、/opt/homebrew/bin - 临时修复:在
zx脚本开头加process.env.PATH = "/opt/homebrew/bin:~/.local/bin:" + process.env.PATH(注意~不展开,得用os.homedir()) - 根治法:VSCode 设置里搜
terminal.integrated.shellArgs,设为["-l"],关掉所有集成终端后重新打开——这样zx启动的每个子bash都能读到~/.zshrc
chmod +x 无效?那是你没搞清 zx 脚本的执行模型
zx 脚本不需要、也不应该依赖 chmod +x。它不是靠内核解析 shebang 执行的,而是由 Node 进程读取并 eval。如果你给 script.mjs 加了 x 权限却仍报错,说明问题不在执行位,而在环境或语法层面。
- 错误示范:
#!/usr/bin/env node+chmod +x→ 在 Windows 上可能因 CRLF 换行符失效;在 WSL 的/mnt/c下 chmod 根本不生效 - 正确姿势:统一用
zx script.mjs或node script.mjs,删掉 shebang 行更安全(zx自己会处理模块加载) - 唯一需要 chmod 的场景:脚本里显式调用
await $`./deploy.sh`—— 此时deploy.sh是独立 Shell 脚本,必须满足 shebang 正确 + chmod +x + LF 换行符三条件
真正容易被忽略的点:zx 的 $ 函数默认不继承当前 shell 的 alias、函数、source 的配置;它开的是干净的 subshell。想复用 ~/.zshrc 里的 alias,得显式 await $`source ~/.zshrc && my-alias`,而不是指望环境自动带过去。










