😎
WSL2とWindowsでnvmを共存させる方法
はじめに
の内容のやり方で
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