问题现象
在 Zsh 中开启 EXTENDED_GLOB 后,nvm v0.40.7 可以使用具体的 Node 版本,但无法解析 default 别名:
$ nvm alias default 24.20.0
default -> 24.20.0 (-> v24.20.0)
$ nvm version default
N/A
$ nvm use default
N/A: version "default" is not yet installed.
部分别名操作还会报错:
nvm_alias:32: bad pattern: #*
这也导致新终端无法自动启用默认 Node,进而找不到 node 和 npm。使用 zsh -f 启动不加载个人配置的 shell 后,别名解析正常。
问题原因
nvm_alias() 使用以下参数展开,移除别名文件中的注释:
NVM_ALIAS_LINE="${NVM_ALIAS_LINE%%#*}"
${变量%%模式} 中的模式也受 Zsh 的 EXTENDED_GLOB 影响。开启该选项后,未转义的 # 会被解释为扩展模式运算符,而不是注释起始字符。
因此,#* 触发 bad pattern,导致别名读取失败,最终返回 N/A。
问题修复
将 # 转义为字面字符:
- NVM_ALIAS_LINE="${NVM_ALIAS_LINE%%#*}"
+ NVM_ALIAS_LINE="${NVM_ALIAS_LINE%%\#*}"
该修改保留原有的注释移除行为,同时兼容 Bash 和开启 EXTENDED_GLOB 的 Zsh,无需全局关闭扩展匹配,也无需在 shell 配置中写死 Node 版本。
本地修复可直接修改 $NVM_DIR/nvm.sh,然后重新加载并验证:
setopt EXTENDED_GLOB
source "$NVM_DIR/nvm.sh"
nvm version default
nvm use default
预期 default 正确解析为已安装版本,新终端自动启用默认 Node。
本地修改可能被后续 nvm 升级覆盖;建议将此修复提交上游,并增加开启
EXTENDED_GLOB时的别名解析回归测试。