😎

WSL2とWindowsでnvmを共存させる方法

に公開

はじめに

https://zenn.dev/tazzae999jp/articles/ca0c4e381a03b0
の内容のやり方で

WSL2とWindowsの両方でnvmを使うようにしたら
WSL2側ではWindows側のnvmや、npmや、nodeや、npxを見てしまう事象が発生した

解決策

.bashrcに

# --- nvm: activate default Node on shell start ---
if command -v nvm >/dev/null 2>&1; then
  nvm use --silent default >/dev/null 2>&1 || {
    nvm install --lts >/dev/null 2>&1
    nvm alias default lts/* >/dev/null 2>&1
    nvm use --silent default >/dev/null 2>&1
  }
  hash -r 2>/dev/null || true
fi

のコードを追加すると解決する(理由は知らん)

解決というのは、
WSL2側では、WSL2側のnvmや、npmや、nodeや、npxを見る
Windows側では、Windows側のnvmや、npmや、nodeや、npxを見る
の状況になるということ!!

.bashrcの内容

・
・
(中略)
・
・

##############################
# auto add for
# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# 2025/08/12
##############################
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

# --- nvm: activate default Node on shell start ---
if command -v nvm >/dev/null 2>&1; then
  nvm use --silent default >/dev/null 2>&1 || {
    nvm install --lts >/dev/null 2>&1
    nvm alias default lts/* >/dev/null 2>&1
    nvm use --silent default >/dev/null 2>&1
  }
  hash -r 2>/dev/null || true
fi
##############################


・
・
(中略)
・
・

確認

$ which npm
/home/myUser/.nvm/versions/node/v22.18.0/bin/npm
$ which node
/home/myUser/.nvm/versions/node/v22.18.0/bin/node
$ which npx
/home/myUser/.nvm/versions/node/v22.18.0/bin/npx

で、Ubuntu環境のログインユーザのhomeディレクトリ配下の.nvm配下
でのパスが表示されてたらOK

しかし、

$ which nvm
$

は何も表示されない

type nvm
と打ち込んだときに、
Bashのシェルスクリプトと思しきコードが、がーっと表示されていれば
nvm本体も、WSL2(Ubuntu)側のものを見てると判断できる

意味

ちなみに、

# --- nvm: activate default Node on shell start ---
if command -v nvm >/dev/null 2>&1; then
  nvm use --silent default >/dev/null 2>&1 || {
    nvm install --lts >/dev/null 2>&1
    nvm alias default lts/* >/dev/null 2>&1
    nvm use --silent default >/dev/null 2>&1
  }
  hash -r 2>/dev/null || true
fi

のコードの意味は、
下記のように、AIが、言ってるが、よくわからん。

if command -v nvm >/dev/null 2>&1; then

nvm が“使える状態か”を確認。command -v はコマンド/関数の所在を返すが、
標準出力/標準エラーは捨てて(>/dev/null 2>&1)見た目は無音。

見つかれば終了コード0 → then 内を実行。なければ fi までスキップ。

つまり「nvm が読み込まれている場合だけ以下を実施」。

nvm use --silent default >/dev/null 2>&1 || { ... }

まず 既定(default)の Node バージョンへ切替を試みる。

成功(終了コード0)なら 右側の { ... } は実行されない。

失敗(default 未設定やインストールなし)なら OR(||)の右側ブロックを実行。

--silent とリダイレクトで一切出力を出さない。

{ nvm install --lts; nvm alias default lts/*; nvm use --silent default; }(失敗時のみ実行)

nvm install --lts

最新LTSの Node を ~/.nvm/versions/node/ にインストール。

nvm alias default lts/*

default エイリアスを 「常に最新LTSを指す」特別エイリアス lts/* に設定。
以後、新しいシェルでは nvm use default が その時点のLTS を指すようになる。

nvm use --silent default

直ちに default を有効化(PATH の先頭に ~/.nvm/versions/node/<ver>/bin を前置)。

これで node/npm/npx は WSLの nvm 管理版が必ず優先される。

hash -r 2>/dev/null || true

シェルのコマンド検索キャッシュをクリア。

直前の nvm use により PATH が変わったので、古い解決結果(例:/mnt/c/.../node.exe)を忘れさせる。

失敗しても続行できるように || true で無害化。

fi

if の終了。

とのこと。

毎回のシェル起動時に、まず nvm use default を試し、ダメなら 自動で LTS を入れて default を作ってから即有効化。

nvm use は PATH の先頭に nvm の bin ディレクトリを前置するため、appendWindowsPath=true で Windows の PATH が混ざっていても、WSL側が確実に先になります。

hash -r で “昔キャッシュされた Windows の node.exe” を無効化。

出力をすべて捨てているので起動時にログが汚れない。

既に default が使える日常は 何も再インストールせず、ただ nvm use default が静かに走るだけ(冪等)

とのこと。

Discussion