如何从 WSL (Ubuntu) 中启动原生安装在 Windows 上的 Atom 或 VSCode?

How to start Atom or VSCode natively installed on Windows from within WSL (Ubuntu)?

我通过下载 运行 安装程序在 Windows 10 上本地安装了 Atom 编辑器。现在我启动 WSL Ubuntu 发行版并希望使用命令 atom . 或 VSCode(visual-studio-code)从那里启动 Atom(atom-editor)和命令 code .

Atom 启动,但不在执行命令的目录中,而是显示来自 C:\Windows 的文件。此外 Ubuntu WSL 终端显示以下错误消息:

atom .
grep: /etc/wsl.conf: No such file or directory
"\wsl$\Ubuntu-18.04\home\wlad\projects\udemy\flask-bootcamp\Flask-Bootcamp-master"
CMD.EXE wurde mit dem oben angegebenen Pfad als aktuellem Verzeichnis gestartet.
UNC-Pfade werden nicht unterstützt.
Stattdessen wird das Windows-Verzeichnis als aktuelles Verzeichnis gesetzt.

抱歉,它是德语本地化版,但上面写着类似 UNC-paths are not supported

的内容

(尚未测试 VSCode)

那么如何在 WSL 中使用安装在 Windows 10 上的 Atom 或 VSCode 编辑器?

** 更新 ** 从今天(2020 年 4 月)开始,有一种更好的方法可以在 Windows 上使用 VSCode w/ WSL、虚拟机 (VM) 甚至容器。查看 remote-development plugin VSCode。

在提到的 blog post @Wlad 的 "Known issues" 部分,有说明

Accessing Linux files is treated the same as accessing a network resource, and any rules for accessing network resources will still apply e.g: When using CMD, cd \wsl$\Ubuntu\home will not work (as CMD does not support UNC paths as current directories), however copy \wsl$\Ubuntu\home\somefile.txt C:\dev\ will work

因此 Atom 可能会使用 cmd.exe 从命令行(可能是一些批处理文件)启动自身,并且鉴于 cmd.exe 无法将网络资源打开为当前目录(WSL 目录)被视为),当您尝试从 WSL shell.

启动 Atom 时出现故障

实际上,在 VS Code 中有一个更好的解决方案可以直接从 WSL 启动 VS Code shell:VS Code Remote.

您可以通过以下步骤让VS Code直接从WSL启动shell:

  1. 在 Windows 端安装扩展 Remote - WSL 到 VS Code;
  2. 然后当您在 WSL shell 中键入 code . 时,VS Code 远程服务器将自动安装,VS Code 将很快启动。

使用VS Code Remote,不仅可以在VS Code中打开目录,还可以在很多方面受益:比如可以使用WSL shell作为集成shell 在 VS Code 中,运行 程序在 WSL 中直接来自 VS Code。

HereVS Code Remote - WSL.

的官方文档

我创建了一个简短的脚本来处理我最常用的三个原子命令(我使用 Ubuntu 和 WSL):

  1. atom
  2. atom .
  3. atom RELATIVE_PATH_FILE

此脚本未优化,我相信很多人会发现边缘情况,但它为我完成了工作。要使用它,只需将它放在 ~/.local/bin/atom 中并使其可由 运行 chmod +x ~/.local/bin/atom 执行。您可能需要重新启动 shell 才能将 ~/.local/bin 添加到您的路径中。为了稍微简化一些事情,我将 ubuntu 安装的 WSL 网络驱动器映射到 U:,所以你要么想做同样的事情,要么在第 9 行相应地修改脚本。

#!/bin/bash

if [ -z  ]; then
  pushd /mnt/c > /dev/null
  /mnt/c/Windows/System32/cmd.exe /c "atom"
else
  [[  = "." ]] && path=$(pwd) || path=$(realpath )

  winPath=$(echo "U:$path" | sed -e 's/\//\/g')

  pushd /mnt/c > /dev/null
  /mnt/c/Windows/System32/cmd.exe /c "atom $winPath"
fi

popd > /dev/null

该脚本执行几个简单的步骤。首先,如果没有命令行参数,它只是使用 cmd.exe 不带参数调用 atom。如果命令行参数是 .,它获取当前目录的路径,否则,它使用 realpath 获取给定文件的绝对路径。在像以前一样使用 cmd.exe 调用 atom 之前,使用 sed 将路径从 POSIX 转换为 Windows 格式,但使用路径参数。

pushdpopd 命令只是用来消除有关不支持 UNC 路径的恼人警告消息:

...
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory

Eduardo 回答中的脚本是一个很好的方法,但不允许一次打开多个 directories/repos(例如 atom terraform-modules terraform-repo),而我经常这样做。

以下是我的转折:

#!/bin/bash

winPathPrefix="U:"

function convertToWinPath() {
  echo "${winPathPrefix}$(realpath )" | sed -e 's/\//\/g'
}

declare -a atomCmd=(/mnt/c/Windows/System32/cmd.exe /c "atom")

for path in "$@"; do
  atomCmd+=($(convertToWinPath ${path}))
done

${atomCmd[@]} 2>/dev/null

这完全基于 Eduardo 的脚本,应该允许更通用的用例

这可能有点过时,但您可以简单地 运行 一个 powershell 并使用:

wsl.exe -d Ubuntu-20.04 //In my case ubuntu

这应该会打开一个 ubuntu 会话或您自己设置的任何 wsl。

在这方面有点笨,但会尽力提供帮助。 =)

想要 运行 来自 WSL 的 Atom 让我来到这里,但不幸的是,接受的答案没有提到 atom,其他与 atom 相关的解决方法不再有效。

以防有人用谷歌搜索问题并最终出现在这里。这是一个实际的解决方法(它会在新的 Atom 更新中中断)。

  • 在windows环境中添加以下路径路径:C:\Users\{username}\AppData\Local\atom\app-{version}\(此时post版本为1.60.0所以app-1.60.0.

    • 使用上面提到的路径,因为默认路径包含一个 bash 可执行文件,它将 运行 在 wsl 中 运行 失败。
    • 这是它在以后的更新中会出现问题的地方。解决方法是将 windows 中的 env 更新为新路径,因为 exe 所在的文件夹将更改以匹配 atom 的版本。
  • 在您的 .bashrc.zshrc 中添加以下内容:

    • 重要的是在 .bashrc.zshrc 中添加,因为在 /usr/bin 中创建单独的脚本将始终使 atom 在 C:/Windows 文件夹中打开。
function _atom () { exec nohup atom.exe "$@" &> /dev/null & } # Do not output in terminal and do not block the terminal. Also send the command arguments to atom.

alias atom="_atom"
  • 打开一个新的 wsl 终端。