关于linux:如何从WSL中删除Win10的PATH

How to remove the Win10's PATH from WSL

我在Win10中使用Windows子系统Linux(Ubuntu 18.04),并在其中安装了Maven。
此外,我之前在Win10中安装了一个Maven。
现在,当我在WSL中使用mvn compile时,它告诉我maven编译失败。
我使用which mvn并发现它引用了Win10中安装的Maven。

此外,我运行env,发现Win10的路径已添加到WSL的路径中。
使用WSL时,我不想在Win10的路径中使用任何东西,该怎么办?


  • 对于低于17713的Windows版本:WSL使用WSL_DISTRIBUTION_FLAGS枚举配置其行为和Windows与Linux端之间的互操作性。这是wslapi.h头文件中的代码段。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* Flags specifying WSL behavior */
    typedef enum
    {
        WSL_DISTRIBUTION_FLAGS_NONE                  = 0x0,
        WSL_DISTRIBUTION_FLAGS_ENABLE_INTEROP        = 0x1,
        WSL_DISTRIBUTION_FLAGS_APPEND_NT_PATH        = 0x2,
        WSL_DISTRIBUTION_FLAGS_ENABLE_DRIVE_MOUNTING = 0x4
    } WSL_DISTRIBUTION_FLAGS;

    #define WSL_DISTRIBUTION_FLAGS_VALID (WSL_DISTRIBUTION_FLAGS_ENABLE_INTEROP | WSL_DISTRIBUTION_FLAGS_APPEND_NT_PATH | WSL_DISTRIBUTION_FLAGS_ENABLE_DRIVE_MOUNTING)
    #define WSL_DISTRIBUTION_FLAGS_DEFAULT (WSL_DISTRIBUTION_FLAGS_ENABLE_INTEROP | WSL_DISTRIBUTION_FLAGS_APPEND_NT_PATH | WSL_DISTRIBUTION_FLAGS_ENABLE_DRIVE_MOUNTING)

    在第一次启动时,WSL使用默认标志= 0x7(即0 1 2 4)。如果该标志= 0x5(即0 1 4)Windows NT路径将不会附加在$PATH环境变量中。那么,如何找到该标志的注册表值? aka在注册表编辑器中打开HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Lxss注册表路径。 regedit.exe。打开具有UID值的每个子项,并将DistributionName与已安装的分发名称匹配。然后将Flags DWORD注册表值编辑/添加到0x5

  • 对于Windows版本高于17713:在新版本中,WSL使用wsl.conf文件配置其行为以及Windows和Linux端之间的互操作性。该wsl.conf文件遵循INI文件格式。运行wsl.exebash.exe。创建文件/etc/wsl.conf。然后,在Linux中的任何文本编辑器中添加以下interop部分。

    1
    2
    3
    [interop]
    enabled=false # enable launch of Windows binaries; default is true
    appendWindowsPath=false # append Windows path to $PATH variable; default is true

    保存该文件并从wsl.exe退出。现在,无论何时执行WSL,Windows路径都不会附加到Linux $PATH环境变量中。


第一步-在WSL上禁用Windows路径
选项A:添加到wsl.conf(在内部版本17093之后)

1
sudo nano /etc/wsl.conf

然后添加

1
2
[interop]
appendWindowsPath = false

然后
Ctrl+S然后Ctrl+X然后exit

选项B:在运行时删除路径

将以下代码添加到.bashrc

1
PATH=$(/usr/bin/printenv PATH | /usr/bin/perl -ne 'print join(":", grep { !/\\/mnt\\/[a-z]/ } split(/:/));')

替代(运行一次!):

1
2
3
echo"export PATH=`echo $PATH | tr ':' '\
' | grep -v /mnt/ | tr '\
' ':'`">> ~/.bashrc

替代2

只需将export PATH="$PATH:/usr/bin"添加到~/.bashrc的末尾,以便usr/bin优先于Windows的应用程序。可能不是一个好选择。

选项C:

编辑Windows注册表。当前不建议使用。

1
HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Lxss\\{GUID}\\Flags

Flags7更改为5,以排除WSL_DISTRIBUTION_FLAGS_APPEND_NT_PATH枚举。

第二步-重新启动WSL
选项A:

重新输入WSL并测试:

1
echo $PATH

选项B:

以管理员身份在PowerShell上运行:

1
Restart-Service LxssManager

选项C:

使用

从PowerShell以管理员身份终止WSL

1
wslconfig /t Ubuntu

适应是您的需要,在我的情况下Ubuntu-18.04

参考文献:

https://github.com/microsoft/WSL/issues/1493

https://devblogs.microsoft.com/commandline/automatically-configuring-wsl

https://gist.github.com/ilbunilcho/4280bd55a10cefef75e74986b6bff936


在Windows注册表中修改Flags属性仍然可以与WSL 2一起使用。它对我来说很好用,也没有引起任何问题。唯一的区别是,在我的情况下,初始Flags值为0x0F (= 15)。将其更改为0x0D (= 13)可以防止将Windows%PATH%附加到Ubuntu $ PATH。

您仍然可以在注册表中的HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Lxss\\下找到所有WSL 2发行版。每个发行版都有自己的GUID子文件夹,看起来像

1
2
3
4
5
6
7
HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Lxss\\
    |
    |-- {40db8e6f-0520-4ddd-9c8b-0f5414e685c9}
    |-- {6a61345d-2dc6-4b9e-abb1-28a26d64e19f}
    |-- {bce2f98a-b234-4749-adbe-7311df078d26}
    |-- ...
    |-- {ea808e4e-dc24-4645-aed0-ebd67c871e01}

当然,您的GUID与我的不同。

通过单击每个GUID并查看DistributionName属性,您可以找到哪个GUID指代WSL 2发行版,请参见下面的屏幕快照中的(1)。然后只需修改Flags值并将其设置为13,请参见屏幕快照中的(2)。如果Flags属性中的值与0x0F不同,则没关系,只需将其减小2即可。

enter