跨 Windows 和 Linux 文件系统工作

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

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

建议不要跨操作系统使用文件,除非有这么做的特定原因。 若想获得最快的性能速度,请将文件存储在 WSL 文件系统中,前提是在 Linux 命令行(Ubuntu、OpenSUSE 等)中工作。 如果使用 Windows 命令行(PowerShell、命令提示符)工作,请将文件存储在 Windows 文件系统中。

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

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

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

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

可使用以下命令从命令行打开 Windows 文件资源管理器,以查看存储文件的目录:

explorer.exe .

另外,还可以使用 powershell.exe /c start . 命令。请确保在命令的末尾添加句点以打开当前目录。

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

View project files in Windows File Explorer

文件名和目录区分大小写

区分大小写确定在文件名或目录中是将大写 (FOO.txt) 和小写 (foo.txt) 字母作为不同项(区分大小写)还是等效项(不区分大小写)进行处理。 Windows 和 Linux 文件系统处理区分大小写的方式不同 - Windows 不区分大小写,而 Linux 区分大小写。 若要详细了解如何调整区分大小写(尤其是在使用 WSL 装载磁盘时),请参阅调整区分大小写操作说明文章。

Windows 和 Linux 命令之间的互操作性

借助 WSL,Windows 和 Linux 工具和命令可互换使用。

  • 从 Linux 命令行(即 Ubuntu)运行 Windows 工具(即 notepad.exe)。
  • 从 Windows 命令行(即 PowerShell)运行 Linux 工具(即 grep)。
  • 在 Windows 与 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(或 wsl.exe)后面的 Linux 命令的处理方式与 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 列出 /proc/cpuinfo Linux 文件系统路径中的文件,请使用 PowerShell:

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

若要使用 Linux 命令 ls -la 列出 C:\Program Files Windows 文件系统路径中的文件,请使用 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 工具 grep 筛选“IPv4”结果,并使用 Linux 工具 cut 删除列字段,请从 Linux 分发版(例如 Ubuntu)输入:

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 本机命令可与 cmd.exe /C 命令一起运行。

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

cmd.exe /C dir

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

ping.exe www.microsoft.com

参数将按原样传递到 Windows 二进制文件。 例如,以下命令将通过 notepad.exe 打开 C:\temp\foo.txt

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

以下命令也会起作用:

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

通过 WSLENV 在 Windows 与 WSL 之间共享环境变量

WSL 和 Windows 共享一个特殊环境变量 WSLENV(为了桥接 Windows 和 WSL 上运行的 Linux 分发版而创建)。

WSLENV 变量的属性:

  • 它是共享的;它同时在 Windows 和 WSL 环境中存在。
  • 它是要在 Windows 与 WSL 之间共享的环境变量列表。
  • 它可以设置环境变量的格式,使其能够在 Windows 和 WSL 中正常运行。
  • 它可以帮助 WSL 和 Win32 之间的流。

备注

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

WSLENV 标志

WSLENV 中有四个标志可以影响该环境变量的转换方式。

WSLENV 标志:

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

可按需组合标志。

阅读有关 WSLENV 的详细信息,包括将 WSLENV 的值设置为其他预定义环境变量串联的常见问题解答和示例,每个示例都带有一个斜杠后缀,斜杠后跟标志,用于指定应如何转换值以及如何使用脚本传递变量。 本文还提供使用 编程语言设置开发环境的示例,该示例配置为在 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 会话后,禁用互操作的结果不会持久保留 -- 启动新会话后,会再次启用互操作。