<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>nvm on Wuan&#39;s Blog</title>
    <link>https://du1ab.org/tags/nvm/</link>
    <description>Recent content in nvm on Wuan&#39;s Blog</description>
    <generator>Hugo -- 0.118.2</generator>
    <language>cn</language>
    <lastBuildDate>Sun, 06 Sep 2026 12:41:21 +0800</lastBuildDate>
    <atom:link href="https://du1ab.org/tags/nvm/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>修复 nvm v0.40.7 在 Zsh 开启 EXTENDED_GLOB 时无法解析别名的问题</title>
      <link>https://du1ab.org/2026/%E4%BF%AE%E5%A4%8D-nvm-v0.40.7-%E5%9C%A8-zsh-%E5%BC%80%E5%90%AF-extended_glob-%E6%97%B6%E6%97%A0%E6%B3%95%E8%A7%A3%E6%9E%90%E5%88%AB%E5%90%8D%E7%9A%84%E9%97%AE%E9%A2%98/</link>
      <pubDate>Sun, 06 Sep 2026 12:41:21 +0800</pubDate>
      <guid>https://du1ab.org/2026/%E4%BF%AE%E5%A4%8D-nvm-v0.40.7-%E5%9C%A8-zsh-%E5%BC%80%E5%90%AF-extended_glob-%E6%97%B6%E6%97%A0%E6%B3%95%E8%A7%A3%E6%9E%90%E5%88%AB%E5%90%8D%E7%9A%84%E9%97%AE%E9%A2%98/</guid>
      <description>问题现象 在 Zsh 中开启 EXTENDED_GLOB 后，nvm v0.40.7 可以使用具体的 Node 版本，但无法解析 default 别名： $ nvm alias default 24.20.0 default -&amp;gt; 24.20.0 (-&amp;gt; v24.20.0) $ nvm version default N/A $ nvm use default N/A: version &amp;#34;default&amp;#34; is not yet installed. 部分别名操作还会报错： nvm_alias:32: bad pattern: #* 这也导致新终端无法自动启用默认 Node，进而找不到 node 和 npm。使用 zsh -f 启动不加载个人配置的 shell 后，别名解析正常。 问题原因 nvm_alias() 使用以</description>
      <content:encoded><![CDATA[<h2 id="问题现象">问题现象</h2>
<p>在 Zsh 中开启 <code>EXTENDED_GLOB</code> 后，nvm v0.40.7 可以使用具体的 Node 版本，但无法解析 <code>default</code> 别名：</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-zsh" data-lang="zsh"><span style="display:flex;"><span>$ nvm <span style="color:#007020">alias</span> default 24.20.0
</span></span><span style="display:flex;"><span>default -&gt; 24.20.0 <span style="color:#666">(</span>-&gt; v24.20.0<span style="color:#666">)</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ nvm version default
</span></span><span style="display:flex;"><span>N/A
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>$ nvm use default
</span></span><span style="display:flex;"><span>N/A: version <span style="color:#4070a0">&#34;default&#34;</span> is not yet installed.
</span></span></code></pre></div><p>部分别名操作还会报错：</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>nvm_alias:32: bad pattern: #*
</span></span></code></pre></div><p>这也导致新终端无法自动启用默认 Node，进而找不到 <code>node</code> 和 <code>npm</code>。使用 <code>zsh -f</code> 启动不加载个人配置的 shell 后，别名解析正常。</p>
<h2 id="问题原因">问题原因</h2>
<p><code>nvm_alias()</code> 使用以下参数展开，移除别名文件中的注释：</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#bb60d5">NVM_ALIAS_LINE</span><span style="color:#666">=</span><span style="color:#4070a0">&#34;</span><span style="color:#70a0d0">${</span><span style="color:#bb60d5">NVM_ALIAS_LINE</span>%%#*<span style="color:#70a0d0">}</span><span style="color:#4070a0">&#34;</span>
</span></span></code></pre></div><p><code>${变量%%模式}</code> 中的模式也受 Zsh 的 <code>EXTENDED_GLOB</code> 影响。开启该选项后，未转义的 <code>#</code> 会被解释为扩展模式运算符，而不是注释起始字符。</p>
<p>因此，<code>#*</code> 触发 <code>bad pattern</code>，导致别名读取失败，最终返回 <code>N/A</code>。</p>
<h2 id="问题修复">问题修复</h2>
<p>将 <code>#</code> 转义为字面字符：</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-diff" data-lang="diff"><span style="display:flex;"><span><span style="color:#a00000">-    NVM_ALIAS_LINE=&#34;${NVM_ALIAS_LINE%%#*}&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#a00000"></span><span style="color:#00a000">+    NVM_ALIAS_LINE=&#34;${NVM_ALIAS_LINE%%\#*}&#34;
</span></span></span></code></pre></div><p>该修改保留原有的注释移除行为，同时兼容 Bash 和开启 <code>EXTENDED_GLOB</code> 的 Zsh，无需全局关闭扩展匹配，也无需在 shell 配置中写死 Node 版本。</p>
<p>本地修复可直接修改 <code>$NVM_DIR/nvm.sh</code>，然后重新加载并验证：</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-zsh" data-lang="zsh"><span style="display:flex;"><span>setopt EXTENDED_GLOB
</span></span><span style="display:flex;"><span><span style="color:#007020">source</span> <span style="color:#4070a0">&#34;</span><span style="color:#bb60d5">$NVM_DIR</span><span style="color:#4070a0">/nvm.sh&#34;</span>
</span></span><span style="display:flex;"><span>nvm version default
</span></span><span style="display:flex;"><span>nvm use default
</span></span></code></pre></div><p>预期 <code>default</code> 正确解析为已安装版本，新终端自动启用默认 Node。</p>
<blockquote>
<p>本地修改可能被后续 nvm 升级覆盖；建议将此修复提交上游，并增加开启 <code>EXTENDED_GLOB</code> 时的别名解析回归测试。</p>
</blockquote>
]]></content:encoded>
    </item>
  </channel>
</rss>
