WSLでWindows側のコマンドを誤って実行してしまう問題と解決策

Tips

はじめに

WSL で開発していると、いろいろなツールをインストールしていくうちに、意図せず Windows 側のコマンドが実行されてしまうことがあります。
たとえば pythonnode と打ったとき、WSL にインストールしたものではなく Windows 側のものが動いてしまうケースです。
この記事では、その原因と解決策として appendWindowsPath の設定を紹介します。

原因: Windows のパスが自動的に追加される

WSL はデフォルトで、起動時に Windows 側の PATH を自動的に WSL の PATH に追記します。
これにより explorer.execlip.exe といった Windows のコマンドが WSL から直接使えるのですが、
同名のコマンドが WSL 側にも存在する場合に意図せず Windows 側が優先されることがあります。

例として、WSL で python3 を入れているにもかかわらず、python と打つと Windows 側の Python が動くといった状況が起こります。
バージョン管理ツールや言語ランタイムが複数環境に存在すると、原因の特定もしにくく地味にストレスになります。

解決策: appendWindowsPath を無効化する

WSL の動作は /etc/wsl.conf というファイルで設定できます。公式ドキュメント
appendWindowsPathfalse にすると、Windows の PATH が自動追記されなくなります。

[interop]
appendWindowsPath = false

設定を反映するには WSL を再起動します。

wsl --shutdown

再起動後、echo $PATH を確認すると /mnt/c/... 系のパスが消えていると思います。

必要なコマンドはシンボリックリンクで対応する

appendWindowsPath を無効にすると、explorer.exe など便利な Windows コマンドも使えなくなります。
そこで、使いたいコマンドだけをシンボリックリンクで /usr/local/bin などに登録する方式をとります。

sudo ln -s /mnt/c/Windows/explorer.exe /usr/local/bin/explorer.exe # 現在のディレクトリをエクスプローラーで開く
sudo ln -s /mnt/c/Windows/System32/clip.exe /usr/local/bin/clip.exe # クリップボードにコピーする

こうすることで余計な Windows 側のコマンドが混入するリスクをなくしつつ、必要なコマンドだけを使えるようにできます。

まとめ

WSL はデフォルトで Windows との便利な機能をオンにしてくれていますが、便利な反面意図しない動作の原因にもなります。
appendWindowsPath を無効にして、必要なものだけをシンボリックリンクで使えるようにしておくと便利さとコントロール感のバランスが取れておすすめです。

コメント

タイトルとURLをコピーしました