通过 VSCode 在 WSL2 中打开一个旨在在 Linux 中构建的项目,这真是太棒了。但是,当我在 WSL2 上运行相同的命令时,终端的行为有所不同。以下是我复制问题的步骤:
- 打开 Ubuntu WSL2。这只会打开一个运行 ubuntu 的终端
- 导航到我想要打开的项目
cd ~/myapp
- 使用 vscode 打开该项目
code .
vscode 在 Linux 环境中打开。左下角显示“WSL:Ubuntu”。我可以在 Linux 上打开项目,就像使用 Linux 计算机一样,这真的很酷。 - 我打开终端并运行此命令
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
}