在 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$
文件名和目录区分大小写
区分大小写决定了在文件名或目录中,大写字母(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 会话之间持续有效 —— 启动新会话时将再次启用互操作。