打开 WSL2 内的项目时,VSCode 终端行为异常

打开 WSL2 内的项目时,VSCode 终端行为异常

通过 VSCode 在 WSL2 中打开一个旨在在 Linux 中构建的项目,这真是太棒了。但是,当我在 WSL2 上运行相同的命令时,终端的行为有所不同。以下是我复制问题的步骤:

  1. 打开 Ubuntu WSL2。这只会打开一个运行 ubuntu 的终端
  2. 导航到我想要打开的项目cd ~/myapp
  3. 使用 vscode 打开该项目code .vscode 在 Linux 环境中打开。左下角显示“WSL:Ubuntu”。我可以在 Linux 上打开项目,就像使用 Linux 计算机一样,这真的很酷。
  4. 我打开终端并运行此命令powershell.exe 'echo "hello-world"'。我收到以下错误:

<3>init:(5450)错误:UtilConnectToInteropServer:300:连接失败 2

如果我打开 WSL2 并运行相同的命令,powershell.exe 'echo "hello-world"'它就会工作。如果使用 vscode 终端,它就不起作用。奇怪的是,它以前可以工作。如果我重新启动计算机,它会开始在 vscode 上工作,最终停止工作。解决方案是使用单独的 WSL2 终端。但如果我可以使用 vscode 集成终端,那就太好了。

另一个解决方案是不使用 powershell。但我需要使用 powershell,因为 WSL2 不支持 USB。我正在构建一个 esp32 项目。构建后,我需要将代码刷入我的微控制器。我必须通过 Windows 执行此操作,这就是我使用 powershell 的原因。我也可以在 Windows 上构建我的项目,但我已经将所有项目配置为在 Linux 上编译和运行智能感知。

答案1

终于让它工作了。我将其添加到~/.zshrc。如果您使用 bash,请将其添加到~/.bashrc

fix_wsl2_interop() {
    for i in $(pstree -np -s $$ | grep -o -E '[0-9]+'); do
        if [[ -e "/run/WSL/${i}_interop" ]]; then
            export WSL_INTEROP=/run/WSL/${i}_interop
        fi
    done
}

如果它停止工作我只需调用该函数。

我从这个链接得到了解决方案:https://github.com/microsoft/WSL/issues/5065

答案2

与 @tono-nam 的 bash/zsh 修复等效pwsh

function Reset-WslInterop
{
    param ($ProcessId = $PID)

    if (Test-Path /run/WSL/$ProcessId`_interop)
    {
        $env:WSL_INTEROP="/run/WSL/$ProcessId`_interop"
        return
    }

    Reset-WslInterop (Get-Process -Id $ProcessId).Parent.Id
}

相关内容