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

How do I use Bash on Ubuntu on Windows (WSL) for my VS Code terminal?

虽然其他问题涉及 ,但作为 VS Code 的终端给新的 WSL 一个旋转是不一样的:它让你可以访问 bash 运行ning实际的 Ubuntu Linux 子系统,而不是 Windows 子系统上的 git-bash 终端 运行ning。

那么我们如何让它作为 VS Code 终端工作,特别是我们如何让它作为功能性开发环境终端工作?

与 git-bash 不同,不幸的是,这并不那么简单,因为 WSL 中的 Ubuntu Linux 配置可以提供一些陷阱,例如 NPM 尝试 (并且失败)到 运行 从你的 Windows Program Files 目录由于 WSL 和 Windows 本身在路径方面的相互作用,以及一些包如 Compass 失败不一定立即对于不习惯在 Linux 上开发的人来说,这是显而易见的原因。什么是为 VS Code 提供可靠的 WSL 终端环境的简单方法,其中最常用的工具在通过 apt-getnpm 安装时将 运行?

此答案旨在帮助其他人避免在 VS Code 中将 WSL 用于终端时花费 1-2 小时进行故障排除并慢慢寻找不同的解决方案来解决常见问题。它不包括安装特定的包,而是包括在安装依赖于它们存在的东西时可能无法正确安装为依赖项的常见包,以及修复相关的通用设置。

步骤总结

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

入门和要求

  • 如果尚未安装,您必须 have WSL installed. (Which means you must be running 64 bit Windows 10, with the appropriate updates) Follow the install guide。这将需要重新启动。

VS 代码终端配置

CTRL+, 键盘快捷键,或 FilePreferencesSettings

在编辑 window 的右上角,确保您在正确的上下文中工作:用户设置工作区设置.

在设置搜索栏中,输入 terminal.integrated.shell.windows(或任何能让您输入足够长的内容)

在实际设置文件中找到设置,使用Edit(鼠标悬停在行上,它会在左边:在没有鼠标的触摸屏上,你应该可以简单地点击该行的左侧)和 select Replace in Settings

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

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

其他IDEs: IntelliJ

打开 Settings/Tools/Terminal 并将 "Shell path" 字段设置为 "C:\Users\USERNAME\AppData\Local\Microsoft\WindowsApps\ubuntu.exe"

让你的 WSL Ubuntu Bash 开发终端功能

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

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

完成后,您的终端中将出现 bash 命令提示符。

请注意,与 Windows 上的 git-bash 不同,这是一个单独的环境。虽然它可以用来 启动 Windows 软件本身,但您需要适当的 Ubuntu 软件包才能 运行 它们在实际终端内。

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

更新 & git

注意:我将把这些记录为 sudo 以供那些只需要其中一部分的人使用,但一开始的一个选择是 sudo su并简单地 运行 在没有 sudo 的情况下执行以下命令。

确保 your Ubuntu packages 是最新的:

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 本机版本并确保使用它们。

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

安装后,运行ning 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")

这是由于 pathing issue with a fairly straightforward solution。使用您最喜欢的 CLI 编辑器(例如 nanovimemacscatsed…等),打开您的 ~/.profile

nano ~/.profile

注意:do NOT attempt to edit Linux files using Windows tools. (Thanks to 对于官方 link 有粗体红色文本解释)如果你不想在终端中为此使用 CLI 编辑器,请参阅此 post 的底部以获取有关如何获得 GUI 运行ning 的 link。

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

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

在前两个二进制目录之后注入 windows 路径。不幸的是,这不会导致 /usr/bin 在 windows 安装的 npm 之前被使用,所以在最后的 $PATH:

之前添加它
PATH="$HOME/bin:$HOME/.local/bin:/usr/bin:$PATH"

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

source ~/.profile

构建必备

如果您使用任何需要编译或以其他方式使用 make 的东西,几乎可以保证您需要安装这些东西;因此,如果您在安装 node.js 时没有安装它们,请安装它们。简单地使用 the build-essential package 而不是尝试单独安装所有内容要容易得多。

请注意,如果没有这些,依赖于 Ruby FFI 的 Compass 等软件包将会失败。如果您在正确安装和 运行 安装工具时遇到问题,确保安装了 gcc 和 make 是一个好的开始。

sudo apt-get install -y build-essential

运行 使用 Ubuntu

的任务

请注意,如果您使用 VS Code 的 tasks.json 来 运行 构建任务,默认情况下它仍会 运行 使用 Windows 子系统而不是 Ubuntu一个。 有时这可能是你想要的,但如果你刚刚在 Ubuntu 而不是 Windows 中完成安装 g运行t-cli,它是可能不是。

VS Code 最近在 2017 年 5 月更新了 Tasks 的工作方式,使其能够 set the task runner as the terminal。这是迄今为止迁移任务最简单的方法。

简单设置

"runner": "terminal",

在您的 tasks.json 中,您就完成了(假设您已经在 WSL Ubuntu 中安装了您尝试 运行 的所有适当工具)。

这是非常可移植的,理想情况下不需要在有或没有 WSL 的系统之间或其他操作系统之间进行更改,这是我推荐的方法。

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

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

您可以使用之前为终端本身提供 VS Code 的相同位置,C:\WINDOWS\Sysnative\bash.exe 作为 command

的值

args 数组的第一个元素设置为 -c,将第二个元素设置为您想要的命令 运行 ().

或者,您可以

更多有用信息

想要

想要? (这将允许你做一些事情,比如在 Ubuntu 系统本身 中对文件 使用 Linux GUI 编辑器:不要使用 Windows 编辑它们编辑工具,请参阅 npm 部分中的 comments/note)

想要构建(请参阅上面关于为 WSL 正确设置 VS 代码任务的部分)和 debug entirely within WSL Ubuntu? (this shows how to do so using gdb, but the pipeTransport concept could be used with other debuggers) (credit to ,但它之前的那个也提供了一种使用本地环回的方法,这可能被证明是有用的)

如果你想使用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",

现在您可以使用 Microsoft's WSL extension

已接受的答案现已在 VSCode 的较新版本中弃用。现在执行此操作的正确方法是配置 terminal.integrated.profiles.windows 设置。

这应该使用终端配置文件的 JSON 个对象进行配置。例如,要配置 WSL,您将使用以下设置:

"terminal.integrated.profiles.windows": {
  "Ubuntu": {
    "path": "wsl.exe"
  }
},

如果这不起作用,请尝试使用 WSL 的完整路径(默认情况下应为 C:\Windows\System32\wsl.exe