VS Code终端如何在Windows(WSL)的Ubuntu(Ubuntu)上使用Bash?


87

虽然其他问题涉及如何使用git-bash之类的问题,但让新的WSL成为VS Code的终端是不一样的:它使您可以访问运行在实际Ubuntu Linux子系统上的bash,而不是git-bash。在Windows子系统上运行的bash终端。

那么,如何使它作为VS Code终端起作用,特别是如何使它作为功能性dev环境终端起作用?

不幸的是,与git-bash不同,这并不是那么简单,因为WSL和Windows本身之间存在交互作用,因此WSL中的Ubuntu Linux配置可以提供一些陷阱,例如NPM尝试从Windows Program Files目录中运行(但失败)。路径方面的问题,以及诸如Compass之类的某些软件包因未必是那些不习惯在Linux上进行开发的人而立即显而易见的原因而失败。为VS Code拥有可靠的WSL终端环境的简单方法是什么,当通过apt-get或安装时,将运行最常用的工具npm

Answers:


184

此答案旨在帮助其他人避免在VS Code中为终端使用WSL时花费1-2个小时进行故障排除,并慢慢找到针对常见问题的不同解决方案。它不涉及安装特定的软件包,而是覆盖一些常见的软件包,这些软件包在安装依赖于它们的存在以及修复相关公共设置的东西时可能无法正确安装为依赖项。

步骤摘要

  • 已安装WSL
  • 为终端配置的VS代码(或其他IDE)
  • 在.profile中安装了NPM和路径修复(可能对其他工具有所帮助)
  • 已安装build-essential(帮助使用make / gcc / etc的任何工具)
  • 使用WSL的VS代码任务
  • 附加功能

入门与要求

  • 您必须已安装WSL。(这意味着您必须运行具有适当更新的64位Windows 10)(如果尚未安装,遵循安装指南)。这将需要重新启动。

VS Code终端配置

无论是CTRL+,键盘快捷键,或File→交通Preferences→交通Settings

在编辑窗口的右上角,确保您在正确的环境中工作:用户设置工作区设置

在此处输入图片说明

在设置搜索栏中,键入terminal.integrated.shell.windows(或使您走得足够远的任何命令)

在实际的设置文件中找到该设置,使用Edit(将鼠标悬停在该行上,它将显示在左侧:在没有鼠标的触摸屏上,您只需轻击该行的左侧),然后选择Replace in Settings

在此处输入图片说明

在右窗格中,修改在修改后的json文件中创建的条目:将以前的设置替换为

"C:\\WINDOWS\\Sysnative\\bash.exe"

在此处输入图片说明

其他IDE:IntelliJ

打开设置/工具/终端,然后将“外壳路径”字段设置为 "C:\Users\USERNAME\AppData\Local\Microsoft\WindowsApps\ubuntu.exe"

使WSL Ubuntu Bash Terminal对开发人员起作用

当使用CTRL+`打开终端时,现在应该有一个bash终端。

如果这是您第一次运行bash.exe,则可能会询问您是否安装Ubuntu。这样做。安装完成后,选择要在WSL Ubuntu中使用的用户名和密码。这些密码不必与您当前的Windows帐户一致,请务必注意,它们不会根据Windows帐户密码的更改而更改。

完成后,您的终端将出现一个bash命令提示符。在此处输入图片说明

请注意,与Windows上的git-bash不同,这是一个独立的环境。尽管它可以用来在其外部启动Windows软件,但是您将需要适当的Ubuntu软件包才能在实际终端中运行它们。

当前,WSL尚未加载您可能期望或习惯的所有内容,并且某些情况可能会基于默认配置文件设置与您在Windows中加载的软件发生冲突。

更新和git

注意:对于那些只需要这些内容的人,我将把它们作为sudo进行记录,但是开始时的一种选择是改为sudo su简单地运行以下命令而不使用sudo。

确保您的Ubuntu软件包是最新的:

sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y dist-upgrade
sudo apt autoremove

安装git:

sudo apt-get install git

Node.js和NPM

如果您已经在Windows中加载了Node或NPM,则由于路径问题而在Ubuntu中运行它们可能会出现问题。因此,您需要安装Ubuntu本机版本并确保使用它们。

首先,与NPM安装的node.js。(替代:安装NVM并使用它来安装node.js)

安装后,运行npm命令可能会失败:例如,npm -v可能会给您:

: not foundram Files/nodejs/npm: 3: /mnt/c/Program Files/nodejs/npm:
: not foundram Files/nodejs/npm: 5: /mnt/c/Program Files/nodejs/npm:
/mnt/c/Program Files/nodejs/npm: 6: /mnt/c/Program Files/nodejs/npm: Syntax error: word unexpected (expecting "in")

这是由于一个相当简单的解决方案存在路径问题。使用您喜欢的CLI编辑器(如nanovimemacscatsed...等),打开你的~/.profile

nano ~/.profile

注意:请勿尝试使用Windows工具编辑Linux文件(感谢@ david-c-rankin对官方链接的评论,并用红色粗体解释了这一点)如果您不想在终端中使用CLI编辑器,请参见本文的底部,以获取有关如何操作的链接。使一个GUI运行。

当前,WSL中的默认bash PATH变量是

PATH="$HOME/bin:$HOME/.local/bin:$PATH"

这是在前两个二进制目录之后注入Windows路径。不幸的是,这不会导致在Windows安装npm之前使用/ usr / bin,因此请将其添加到最后的$ PATH之前:

PATH="$HOME/bin:$HOME/.local/bin:/usr/bin:$PATH"

保存,然后重新加载终端或仅获取路径文件

source ~/.profile

必要的

如果您正在使用任何需要编译的内容,或者使用了make,那么几乎可以肯定您会安装这些内容。因此,如果您在安装node.js时未安装它们,请这样做。简单地使用build-essential软件包比尝试单独安装所有组件要容易得多。

请注意,没有这些,依赖于Ruby FFI的软件包(如Compass)将失败。如果您在正确安装和运行工具时遇到麻烦,请确保已安装gcc并进行make安装是一个不错的起点。

sudo apt-get install -y build-essential

使用Ubuntu运行任务

请注意,如果您使用VS Code的task.json运行构建任务,则默认情况下,它仍将使用Windows子系统而不是Ubuntu子系统运行它们。有时这可能是您想要的,但是如果您刚刚在Ubuntu而非Windows中完成grunt-cli的安装,则可能不是。

VS Code最近在2017年5月更新了Tasks的工作方式,使它可以将TaskRunner设置为终端。到目前为止,这是迁移任务的最简单方法。

简单设置

"runner": "terminal",

在你tasks.json就大功告成了(假设你把所有的适当的工具,你正在尝试运行已经安装在Ubuntu的WSL)。在此处输入图片说明

这是非常可移植的,理想情况下不需要在具有或没有WSL的系统之间或与其他OS进行任何更改,这是我建议的方法。

目前,此方法产生另一个TERMINAL选项卡实例(从下拉列表访问)。您仍然可以设置适当的观察者,但这确实意味着它不再位于OUTPUT选项卡上。

旧方法能够调用WSL Ubunutu Bash Shell并将其显示在中OUTPUT,并且涉及使用-c参数调用bash.exe或使用Shell脚本。不幸的是,它不是语义上的,因为我们正在bash执行命令并将其传递给想要作为参数运行的命令。这也意味着它不能很快移植到其他系统。

您可以为终端本身使用先前为VS Code指定的位置,C:\\WINDOWS\\Sysnative\\bash.exe作为command在此处输入图片说明

args数组的第一个元素设置为-c,将第二个元素设置为要运行的命令(记入此答案的后半部分)。

另外,您也可以运行一个shell脚本,如此处所示

其他有用的位

从WSL bash命令行在Windows中启动VSCode

是否希望为您的WSL Ubuntu提供图形界面?(这将允许您执行诸如使用Linux GUI编辑器对Ubuntu系统本身中的文件进行操作:请勿使用Windows编辑工具对其进行编辑,请参阅npm中的注释/注释)

想要构建(请参阅上面的部分,为WSL正确设置VS Code Tasks)并完全在WSL Ubuntu中进行调试?(这显示了如何使用gdb来执行此操作,但是该pipeTransport概念可以与其他调试器一起使用)(该答案的版权,但之前的内容还提供了一种使用本地环回的方法,该方法可能会有用)


10
好的答案,这对于通知新的WSL用户不要使用Windows应用程序和工具更改Linux文件也很有用。这可能会令人惊讶。
David C. Rankin

1
很棒的文章,谢谢!不知道您是否看到过此消息,但是还可以创建一个注册表项来防止Windows PATH注入Bash中,对于许多Windows用户而言,这比手动编辑其更容易.profile
Tobias J

3
@ChangQian的原因是,发布64位窗口时,他们为32位程序添加了文件系统重定向器,因为System32是为64位dll /软件保留的。这将导致32位应用程序尝试访问System32而不是访问SysWOW64(是的,它似乎是向后的)。系统强制这种情况不会发生,但不会出现在资源管理器之类的64位软件*中。您可以使用32位命令提示符查看此示例:C:\Windows\SysWOW64\cmd.exe并运行dir C:\Windows\Sysnative *这在64位VSCode中有效,因为它被编码为自动翻译
-taswyn

2
当您将终端设置为时,ubuntu.exe您可能最终会出现在用户文件夹中而不是项目文件夹中。这就是为什么你要你的终端设置为C:\\Windows\\System32\\wsl.exe根据github.com/Microsoft/WSL/issues/2795使用wslconfig /setdefault Ubuntu,以确保正确的安装开始。
BernhardDöbler'18

1
当我写这篇文章时,就是WSL被锁定得多(在发行版本选择之前)。我有一台装有全新安装的Windows的机器,至少已经更新到了Spring Creator的版本,因此我最终将在不久的将来真正看一下可以对各种注释进行哪些改进,并尝试回答您的问题@Narnia。
taswyn

4

如果要使用zsh,请找到ubuntu1804.exe或ubuntu1604.exe的路径。

就我而言

"terminal.external.windowsExec": "C:\\Users\\asdf\\AppData\\Local\\Microsoft\\WindowsApps\\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\\ubuntu1804.exe",
"terminal.integrated.shell.windows": "C:\\Users\\asdf\\AppData\\Local\\Microsoft\\WindowsApps\\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\\ubuntu1804.exe",

在ubuntu上的Visual Studio代码和WSL的1.32版本上运行良好。谢谢!
Salvador P.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.