跨 Windows 和 Linux 文件系统工作

在 Windows 和 Linux 文件系统之间工作时,需要牢记一些注意事项。 本指南概述了其中的一些内容,包括混合使用 Windows 和基于 Linux 的命令的互作性支持的一些示例。

跨文件系统的文件存储和性能

我们建议避免在不同操作系统之间使用文件,除非您有特定原因这样做。 为了获得最快的性能速度,如果在 Linux 命令行(Ubuntu、OpenSUSE 等)中工作,请将文件存储在 WSL 文件系统中。 如果在 Windows 命令行(PowerShell、命令提示符)中工作,请将文件存储在 Windows 文件系统中。

例如,在存储 WSL 项目文件时:

  • 使用 Linux 文件系统根目录:/home/<user name>/Project
  • 不是 Windows 文件系统的根目录:/mnt/c/Users/<user name>/Project$C:\Users\<user name>\Project

在 WSL 命令行的文件路径中看到 /mnt/ 时,这意味着您正在使用已挂载的驱动器。 因此,在 WSL 命令行中装载时,Windows 文件系统 C:/ 驱动器 (C:\Users\<user name>\Project) 将如下所示: /mnt/c/Users/<user name>/Project$ 可以将项目文件存储在装载的驱动器上,但如果将它们直接存储在驱动器上 \\wsl$ ,性能速度会提高。

在 Windows 文件资源管理器中查看当前目录

可以通过从命令行打开 Windows 文件资源管理器来查看存储文件的目录,方法是:

explorer.exe .

或者,也可以使用命令: powershell.exe /c start . 请务必在命令末尾添加句点以打开当前目录。

若要查看 Windows 文件资源管理器中所有可用的 Linux 发行版及其根文件系统,请在地址栏中输入: \\wsl$

在 Windows 文件资源管理器中查看项目文件

文件名和目录区分大小写

区分大小写决定了在文件名或目录中,大写字母(FOO.txt)和小写字母(foo.txt)是作为区分(区分大小写)处理的,还是作为等效(不区分大小写)处理的。 Windows 和 Linux 文件系统在处理大小写敏感性时采用不同的方式,其中 Windows 不区分大小写,而 Linux 区分大小写。 若要详细了解如何调整大小写敏感度,尤其是在使用 WSL 装载磁盘时,请参阅 调整大小写敏感度 指南。

Windows 和 Linux 命令之间的互作性

Windows 和 Linux 工具和命令可与 WSL 互换使用。

  • 从 Linux 命令行(例如 Ubuntu)运行 Windows 工具(即 notepad.exe)。
  • 从 Windows 命令行(例如 PowerShell)运行 Linux 工具(例如 grep)。
  • 在 Linux 和 Windows 之间共享环境变量。 (内部版本 17063+)

从 Windows 命令行运行 Linux 工具

使用 wsl <command> (或 wsl.exe <command>) 从 Windows 命令提示符(CMD)或 PowerShell 运行 Linux 二进制文件。

例如:

C:\temp> wsl ls -la
<- contents of C:\temp ->

以这种方式调用的二进制文件:

  • 使用与当前 CMD 或 PowerShell 提示符相同的工作目录。
  • 以 WSL 默认用户身份运行。
  • 具有与调用进程和终端相同的 Windows 管理权限。

以下 wsl Linux 命令(或 wsl.exe),将像在 WSL 中运行的任何命令一样处理。 sudo、管道和文件重定向等功能运行正常。

使用 sudo 更新默认 Linux 分发版的示例:

C:\temp> wsl sudo apt-get update

运行此命令后,将列出默认的 Linux 分发用户名,系统会要求你输入密码。 正确输入密码后,分发版将下载更新。

混合 Linux 和 Windows 命令

下面是使用 PowerShell 混合 Linux 和 Windows 命令的几个示例。

若要使用 Linux 命令 ls -la 列出文件和 PowerShell 命令 findstr 来筛选包含“git”的字词的结果,请合并这些命令:

wsl ls -la | findstr "git"

若要使用 PowerShell 命令 dir 列出文件和 Linux 命令 grep 来筛选包含“git”的单词的结果,请合并这些命令:

C:\temp> dir | wsl grep git

若要使用 Linux 命令 ls -la 列出文件和 PowerShell 命令 > out.txt 将该列表打印到名为“out.txt”的文本文件,请合并这些命令:

C:\temp> wsl ls -la > out.txt

传入 wsl.exe 的命令将转发到 WSL 进程,无需修改。 文件路径必须以 WSL 格式指定。

若要使用 Linux 命令 ls -la 列出 Linux 文件系统路径中的 /proc/cpuinfo 文件,请使用 PowerShell:

C:\temp> wsl ls -la /proc/cpuinfo

若要使用 Linux 命令 ls -la 列出 Windows 文件系统路径中的 C:\Program Files 文件,请使用 PowerShell:

C:\temp> wsl ls -la "/mnt/c/Program Files"

从 Linux 运行 Windows 工具

WSL 可以使用 [tool-name].exe 直接从 WSL 命令行运行 Windows 工具。 例如,notepad.exe

应用程序以这种方式运行具有以下属性:

  • 保留工作目录作为 WSL 命令提示符(在大多数情况下 -- 异常如下所述)。
  • 具有与 WSL 进程相同的权限。
  • 以活动 Windows 用户身份运行。
  • 在 Windows 任务管理器中显示为直接从 CMD 提示符执行。

在 WSL 中运行的 Windows 可执行文件的处理方式与本机 Linux 可执行文件类似,管道、重定向,甚至后台处理都能如预期正常工作。

要运行 Windows 工具 ipconfig.exe,请先在 Linux 发行版(例如 Ubuntu)中使用 Linux 工具 grep 筛选“IPv4”结果,再使用 Linux 工具 cut 去除列字段。输入:

ipconfig.exe | grep IPv4 | cut -d: -f2

让我们尝试一个混合 Windows 和 Linux 命令的示例。 打开 Linux 分发版(即Ubuntu) 并创建文本文件: touch foo.txt。 现在,使用 Linux 命令 ls -la 列出直接文件及其创建详细信息,以及 Windows PowerShell 工具 findstr.exe 来筛选结果,因此只有 foo.txt 文件显示在结果中:

ls -la | findstr.exe foo.txt

在 Windows 操作系统中,工具必须包含文件扩展名,匹配文件名的大小写,并且为可执行文件。 非可执行文件,包括批处理脚本。 可以用 dir 命令来运行cmd.exe /C这样的 CMD 本机命令。

例如,通过输入以下内容列出 Windows 文件系统 C:\ 目录的内容:

cmd.exe /C dir

或使用ping命令向 microsoft.com 网站发送回显请求:

ping.exe www.microsoft.com

参数将传递给未修改的 Windows 二进制文件。 例如,以下命令将在C:\temp\foo.txt中打开notepad.exe

notepad.exe "C:\temp\foo.txt"

这也会起作用。

notepad.exe C:\\temp\\foo.txt

使用 WSLENV 在 Windows 和 WSL 之间共享环境变量

WSL 和 Windows 共享一个特殊的环境变量, WSLENV用于桥接在 WSL 上运行的 Windows 和 Linux 分发版。

WSLENV变量的属性:

  • 它共享;它存在于 Windows 和 WSL 环境中。
  • 它是在 Windows 和 WSL 之间共享的环境变量列表。
  • 它可以设置环境变量的格式,以在 Windows 和 WSL 中正常工作。
  • 它可以协助 WSL 与 Win32 之间的交互。

注释

在 17063 之前,只有 WSL 可以访问 PATH 的 Windows 环境变量(因此可以从 WSL 下启动 Win32 可执行文件)。 从 17063 开始, WSLENV 开始受支持。 WSLENV 区分大小写。

WSLENV 标志

WSLENV 中,有四个标志可以影响环境变量的翻译方式。

WSLENV 标志:

  • /p - 转换 WSL/Linux 样式路径和 Win32 路径之间的路径。
  • /l - 指示环境变量是路径列表。
  • /u - 指示仅当从 Win32 运行 WSL 时,才应包含此环境变量。
  • /w - 指示仅当从 WSL 运行 Win32 时,才应包含此环境变量。

可以根据需要组合标志。

阅读有关 WSLENV 的详细信息,包括常见问题解答和将 WSLENV 的值设置为其他预定义环境 var 的串联的示例,每个后缀都带有斜杠后跟标志,以指定应如何转换值并使用脚本传递变量。 本文还包括使用 Go 编程语言设置开发环境的示例,该语言配置为在 WSL 和 Win32 之间共享 GOPATH。

禁用互操作性

用户可以通过以 root 身份运行以下命令来禁用为单个 WSL 会话运行 Windows 工具的功能:

echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop

若要重新启用 Windows 二进制文件,请退出所有 WSL 会话并重新运行 bash.exe 或以 root 身份运行以下命令:

echo 1 > /proc/sys/fs/binfmt_misc/WSLInterop

禁用互操作不会在 WSL 会话之间持续有效 —— 启动新会话时将再次启用互操作。