You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非登录Shell下通过Shebang配置nvm+Node脚本的语法问题

解决非登录Shell中通过Shebang配置nvm启用Node环境的问题

问题场景

我需要在非登录Shell(non-login shell)中,通过Node脚本顶部的Shebang配置nvm,从而正常启用Node环境。在登录Shell(login shell)中,使用以下Shebang就能正常运行脚本:

#!/usr/bin/env node

但这个写法在非登录Shell里无法生效,我想实现等效于以下逻辑的Shebang:

#!/usr/bin/env [[ -s $HOME/.nvm/nvm.sh ]] && source "$HOME/.nvm/nvm.sh" && node

尝试过引号包裹脚本、用bash -c执行等多种方式,都出现了解析错误。

我的完整脚本如下:

#!/usr/bin/env node

const semver = require('semver');
console.log("Hello World! You're using " + process.version)

出现的错误

  • 在登录Shell中执行脚本时:
❯ bin/nodesample.js
env: [[: No such file or directory
  • 在非登录Shell中执行脚本时:
env: [[: No such file or directory
  • 尝试使用带引号的Shebang #!/usr/bin/env "[[ -s $HOME/.nvm/nvm.sh ]] && source "$HOME/.nvm/nvm.sh" && node" 时:
env: "[[: No such file or directory

解决方案

正确的做法是让bash来处理nvm的加载逻辑,再调用node执行脚本,修改后的Shebang及脚本开头如下:

#!/usr/bin/env bash
# 检查nvm脚本是否存在且非空,存在则加载
[[ -s "$HOME/.nvm/nvm.sh" ]] && source "$HOME/.nvm/nvm.sh"
# 用node替换当前bash进程,执行脚本并传递所有参数
exec node "$0" "$@"

const semver = require('semver');
console.log("Hello World! You're using " + process.version)

原理说明

  • env命令只能接收单个命令和对应的参数,无法直接解析Shell的条件判断、链式执行等语法,所以必须先启动bash来处理这些逻辑。
  • exec node "$0" "$@"会用node进程替换当前的bash进程,避免额外的Shell进程残留,同时将脚本路径($0)和所有传入参数($@)传递给node,保证脚本的正常执行逻辑不受影响。

内容的提问来源于stack exchange,提问作者Preet Sangha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:01:55