如何从WSL中删除Win10的PATH

72
我在Win10中使用Windows子系统Linux(Ubuntu 18.04),安装了Maven。 此外,我之前也在Win10中安装了一个Maven。 现在,在WSL中使用 mvn compile 时,它告诉我Maven编译失败。 我使用 which mvn 发现它引用了Win10中安装的Maven。
此外,我运行 env 并发现Win10的Path已添加到WSL的Path中。 我不想在使用WSL时使用Win10的Path中的任何内容,该怎么做?
4个回答

121

对于Windows构建版本高于17713

WSL使用每个Linux虚拟机文件系统中的/etc/wsl.conf文件来配置其行为。如果需要,请创建该文件并将以下配置设置(在此处解释)添加到/etc/wsl.conf中:

[interop]
appendWindowsPath = false

请注意,为使此功能正常工作,appendWindowsPath 必须位于[interop]下。您可能需要使用wsl --shutdownwsl -t <Distribution>关闭当前的WSL实例以使更改生效。您还可以在[interop]部分下添加选项enabled=false来禁用从WSL内部启动Windows二进制文件的功能。
对于低于17713版本的Windows构建:
WSL使用WSL_DISTRIBUTION_FLAGS枚举来配置其行为。以下是wslapi.h头文件中的代码片段。
/* 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使用默认的flag = 0x7(即0 + 1 + 2 + 4)。如果flag = 0x5(即0 + 1 + 4),则Windows NT路径将不会附加在$PATH环境变量中。要查找该标志的注册表值,请在注册表编辑器(即regedit.exe)中打开HKCU\Software\Microsoft\Windows\CurrentVersion\Lxss。打开每个带有UID值的子键,并将DistributionName与您安装的发行版名称匹配。然后将Flags DWORD注册表值编辑/添加为0x5


15
在修改WSL中的"wsl.conf"文件后,您需要执行"wsl --shutdown"命令以使更改生效。 - AndrewBourgeois
2
后者对我并没有起作用。虽然它是一个ini文件,但我删除了所有的注释(包括#后面的内容和#本身),并在“=”周围加上了空格。 要重新启动WSL,您也可以使用ctrl-x->powershell(管理员)并运行“Restart-Service LxssManager”。 - merinoff
1
值得注意的是,如果您在安装17713之前在Windows 10上安装了WSL,则第一条指令仍然是答案。 - SEoF
这真的起作用了!对我来说,https://github.com/microsoft/WSL/issues/1493#issuecomment-266480323 上的分辨率没有任何作用。将interop添加到wsl.conf中就可以了。(顺便说一句,我正在使用WSL2) - atultw
在Win10 LTSC 1809 Build 17763.1875上使用WSL1,根据我的情况需要进行注册表编辑。 - Nick
显示剩余5条评论

51

第一步 - 在WSL上禁用Windows路径

选项A:在wsl.conf中添加(适用于版本17093之后)

sudo nano /etc/wsl.conf

然后添加

[interop]
appendWindowsPath = false

然后按Ctrl+S,再按Ctrl+X,最后按exit

选项B:运行时删除路径

将以下代码添加到.bashrc文件中:

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

替代方案(仅运行一次!):

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

备选方案2

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

方案C:

编辑Windows注册表。目前不建议使用此方法。

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

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


第二步 - 重新启动WSL

选项A:

简单地重新进入WSL并进行测试:

echo $PATH

方案B:

以管理员身份运行PowerShell:

Restart-Service LxssManager

选项C:

使用管理员权限的PowerShell终止WSL

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


最全面的答案! - Mrchief
尽管在Build 17093之后wsl.conf可用,但选项appendWindowsPath仅适用于Insider Build 17713及更高版本。 - what the

2

警告:如果您的WSL2发行版是在Windows版本17093之后安装的,请勿将“Flags” regedit值从0xf更改为0x5,就像WSL1的情况一样。这将在下次关闭/重启时破坏您的WSL2设置,导致所有数据丢失。将其更改为0xD将起作用以从您的unix路径中删除NT路径。


2
修改 Windows 注册表中的“Flags”属性仍然适用于 WSL 2。对我来说很有效,没有引起任何问题。唯一的区别是,在我的情况下,“Flags”初始值为“0x0F(=15)”。将其更改为“0x0D(=13)”可防止将 Windows %PATH% 追加到 Ubuntu $PATH 中。
您仍然可以在注册表中找到所有 WSL 2 发行版,路径为“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\"。每个发行版都有自己的 GUID 子文件夹,看起来类似于...
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 image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接