WSLでWindowsのPATHを引き継がないようにする方法

【令和2年10月24日更新: Windows 10 20H2のWSL2で確認済み】

Windows 10 64bitではWindows Subsystem for Linux (WSL)を用いて気軽にLinux環境で遊べるようになりました。しかし、そのままWSLのLinuxを起動した場合、Windowsの環境変数PATHを引き継いでしまいます。これにはWindows上のコマンドをそのまま実行できるという利点がありますが、WSLから見えているパスの違いによる起動失敗、予期せぬコマンドの実行、PATHにスペースが含まれていることによる不具合、などの弊害も少なからずあります。

この記事ではWindowsのPATHを引き継がないようにするための設定を記述します。なお、Windows 10のバージョンによって設定方法が異なります。特に明記しない限り、Microsoft Storeで入手できる「Ubuntu」を使用した場合になります。他のディストリビューションでは検証していませんが、ほぼ同じと思われます。

## Windows 10 1809 - 20H2 WSL1およびWSL2

ディストリビューション毎に、そのLinux上の`/etc/wsl.conf`ファイルで設定します。Linuxにログインして、`sudo vim /etc/wsl.conf`等で編集してください。(ファイルがない場合は、新規作成してください。)

```/etc/wsl.conf
[interop]
appendWindowsPath = false
```

あわせて、`enabled = false`も書けば、Windowsの通常プログラムをWSL上で実行する事もできなくなります。その他にもマウントのオプション等をwsl.confで設定できます。細かい設定内容については下記の公式ドキュメントやブログを参照してください。

[Linux ディストリビューションの管理 | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config) ※ 設定値とかも機械翻訳されている場合がありますので、概要がわかったら細かいところは英語で読むことをお勧めします。
[Automatically Configuring WSL – Windows Command Line Tools For Developers](https://blogs.msdn.microsoft.com/commandline/2018/02/07/automatically-configuring-wsl/)

この方法はWSL1とWSL2の両方で可能です。

後述のWindows 10 1709 - 1803での方法でも可能な場合もありますが、WSL2等については確認していません。

## Windows 10 1709 - 1803

全てのディストリビューションに設定する方法と、個別に設定する方法の二つがあります。

### 全てのディストリビューションに反映

下記レジストリを追加することで、全てのディストリビューションで無効化されます。

```追加PATH無効正式版.reg
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LxssManager]
"DistributionFlags"=dword:fffffffd
```

Issueの情報によると、ディストリビューション毎の個別設定GUIを提供したいと考えていたようです。ただ、それが間に合っていなく、とりあえず全体で無効化する方法を用意しているという形のようです。[^1]

[^1]: GUIはありませんが、1809以降は`/etc/wsl.conf`で個別設定公式に可能になりました。

### 特定のディストリビューションのみに反映

**【これは公式の方法ではありません。】**

HKCUのディストリビューション毎のレジストリキーには`Flags`というレジストリ値があります。どうやら、上に書いた`DistributionFlags`は`Flags`のマスク値のようです。つまり、マスクによって除外される値`0x00000002`がPATHを引き継ぐかどうかのフラグとなっているようです。例えば、Ubuntuではデフォルトの値`dword:00000007`ですので、2だけひいた`dword:00000005`にすればうまくいきそうです。

```追加PATH無効Ubuntu(実験的).reg
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{7b23236a-3e42-4ecf-9940-e7e50e98b9bc}]
"Flags"=dword:00000005
```

**`{7b23236a-3e42-4ecf-9940-e7e50e98b9bc}`はインストールしたディストリビューションによって異なります。**手元の環境では、上記レジストリでPATHが引き継がないようになりました。全体設定と違い、各ユーザー毎かつ各ディストリビューション毎の設定になります。

なお、正式な文献等の根拠はありませんので、**動作は一切保証しません**。自己責任でお使いください。

Ubuntu以外のディストビューションでも同様にできる可能性はありますが、調べていません。デフォルトの`Flags`の値も異なる可能性がありますので、ご注意ください。

## Windows 10 1607 - 1703 (レガシー版)

Microsoft Storeに公開される前の、Windows 10 1607から提供された、開発者向けのBash on Ubuntu on Windowsと言われているWSL環境についてです。この頃から使っている場合は、1709以降もそのまま利用している人もいるかと思います。

下記レジストリを追加することで、無効化できます。

```追加PATH無効β版.reg
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss]
"AppendNtPath"=dword:00000000
```

設定はユーザー単位です。Microsoft Storeにある正式版では、この設定では反映されません。


---

【参考Issues】

* [[Question] How to remove Windows pathes from WSL PATH? · Issue #1493 · Microsoft/WSL · GitHub](https://github.com/Microsoft/WSL/issues/1493)
* [bash $PATH includes native Windows path(work around "AppendNtPath"=dword:00000000 *Not working*) · Issue #2048 · Microsoft/WSL · GitHub](https://github.com/Microsoft/WSL/issues/2048)