我在Win10中使用Windows子系统Linux(Ubuntu 18.04),并在其中安装了Maven。
此外,我之前在Win10中安装了一个Maven。
现在,当我在WSL中使用mvn compile
时,它告诉我maven编译失败。
我使用which mvn
,发现它引用了Win10中安装的Maven。
此外,我运行env
,发现Win10的路径已添加到WSL的路径中。
使用WSL时,我不想在Win10的路径中使用任何东西,该怎么办?
答案 0 :(得分:16)
对于Windows而言,其版本低于17713:WSL使用WSL_DISTRIBUTION_FLAGS Enumeration来配置Windows和Linux端之间的行为和互操作性。这是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使用默认标志= 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版本HIGHER than 17713:在新版本中,WSL使用wsl.conf
file来配置Windows和Linux端之间的行为和互操作性。该wsl.conf
文件位于INI file format之后。运行wsl.exe
或bash.exe
。创建文件/etc/wsl.conf
。然后,使用Linux中的任何文本编辑器添加以下interop section。
[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
环境变量中。
答案 1 :(得分:11)
sudo nano /etc/wsl.conf
然后添加
[interop]
appendWindowsPath = false
然后
先依次Ctrl+S
和Ctrl+X
然后exit
。
将以下代码添加到.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
只需将export PATH="$PATH:/usr/bin"
添加到~/.bashrc
的末尾,以使usr/bin
优先于Windows应用程序。可能不是一个好选择。
编辑Windows注册表。 目前不推荐。
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{GUID}\Flags
将Flags
从7
更改为5
,以排除WSL_DISTRIBUTION_FLAGS_APPEND_NT_PATH
枚举。
简单重新输入WSL并进行测试:
echo $PATH
以管理员身份在PowerShell上运行:
Restart-Service LxssManager
使用以下命令以管理员身份终止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
答案 2 :(得分:0)
在Windows注册表中修改{'Blue': {'Discrepancies Identified': 2082,
'Files Analyzed': 1098,
'Files Assigned': 87,
'Files Loaded': 1595},
'Red': {'Discrepancies Identified': 1606,
'Files Analyzed': 59,
'Files Assigned': 1510,
'Files Loaded': 110},
'Yellow': {'Discrepancies Identified': 47,
'Files Analyzed': 1238,
'Files Assigned': 1253,
'Files Loaded': 4285}}
属性仍然可以与WSL 2一起使用。它对我来说很好用,也没有引起任何问题。唯一的区别是,在我的情况下,初始Flags
的值为Flags
。将其更改为0x0F (= 15)
可以防止将Windows%PATH%附加到Ubuntu $ PATH。
您仍然可以在0x0D (= 13)
下的注册表中找到所有WSL 2发行版。每个发行版都有自己的GUID子文件夹,看起来像
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\
当然,您的GUID与我的不同。
通过单击每个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指代WSL 2发行版,请参见下面的屏幕快照(1)。然后只需修改DistributionName
值并将其设置为13,请参见屏幕快照中的(2)。如果Flags
属性中的值与Flags
不同,则没关系,只需将其减小2,就可以了。
答案 3 :(得分:0)
警告:如果您的 WSL2 发行版是在 Windows 版本 17093 之后安装的,请不要像 WSL1 那样将“Flags”regedit 值从 0xf 更改为 0x5。这将在下次关闭/重新启动时破坏您的 WSL2 设置,从而丢失您的所有数据。将其更改为 0xD 可以从您的 unix 路径中删除 NT 路径。