【问题标题】:How to remove the Win10's PATH from WSL如何从 WSL 中删除 Win10 的 PATH
【发布时间】:2018-12-22 11:39:18
【问题描述】:

我在 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里面的东西,怎么办?

【问题讨论】:

    标签: linux maven path windows-10 windows-subsystem-for-linux


    【解决方案1】:
    • 对于低于 17713 的 Windows 版本:WSL 使用 WSL_DISTRIBUTION_FLAGS Enumeration 配置其行为和 Windows 和 Linux 端之间的互操作性。这是wslapi.h头文件中的代码sn-p。

        /* 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 环境变量中。那么,如何找到那个标志的注册表值呢?在注册表编辑器中打开 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.exebash.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 环境变量。

    正如 AndrewBourgeois 所说,您可能需要使用 wsl --shutdownwsl -t <Distribution> 关闭当前的 wsl 实例才能使更改生效。

    【讨论】:

    • 在 WSL 中修改“wsl.conf”文件后,您需要“wsl --shutdown”才能使更改生效。
    • 后者并不完全适合我。即使它是一个 ini 文件,我也删除了所有 cmets(在 # 之后,包括 #)并在 '=' 周围放置空格。要重启 WSL,您也可以 ctrl-x->powershell(admin) 并运行“Restart-Service LxssManager”。
    • 这修复了我的 conda 安装在将我的 linux 发行版更新到 WSL2 后出现的问题。因为它在尝试激活 conda 环境时突然导入了导致意外错误的 windows 路径。
    • 值得注意的是,如果您在安装 17713 之前在 Windows 10 上安装了 WSL,那么第一个说明仍然是答案。
    • 这确实有效!对我来说,github.com/microsoft/WSL/issues/1493#issuecomment-266480323 的决议没有做任何事情。将互操作添加到 wsl.conf 有效。 (顺便说一下,我用的是 WSL2)
    【解决方案2】:

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

    选项 A:添加到 wsl.conf(在 Build 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

    只需将export PATH="$PATH:/usr/bin" 添加到~/.bashrc 的末尾,以便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

    【讨论】:

    • 最全面的答案!
    • 虽然 wsl.conf 在 Build 17093 之后可用,但选项 appendWindowsPath 仅在 Insider Build 17713 及更高版本中可用
    【解决方案3】:

    修改 Windows 注册表中的 Flags 属性仍然适用于 WSL 2。它对我来说很好,并且没有引起任何问题。唯一的区别是我的初始Flags 值是0x0F (= 15)。将其更改为 0x0D (= 13) 会阻止将 Windows %PATH% 附加到 Ubuntu $PATH。

    您仍然可以在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\ 下的注册表中找到所有 WSL 2 发行版。每个发行版都有自己的 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就可以了。

    【讨论】:

      【解决方案4】:

      警告:如果您的 WSL2 发行版是在 Windows 构建 17093 之后安装的,请不要将“标志”注册表值从 0xf 更改为 0x5,就像 WSL1 的情况一样。这将在下次关闭/重新启动时破坏您的 WSL2 设置,从而丢失所有数据。将其更改为 0xD 将有助于从您的 unix 路径中删除 NT 路径。

      【讨论】:

        猜你喜欢
        • 2021-09-22
        • 2022-11-04
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 2019-12-28
        • 1970-01-01
        • 2021-09-16
        • 2013-02-17
        相关资源
        最近更新 更多