问题现象

在 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,进而找不到 nodenpm。使用 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 时的别名解析回归测试。