跨 Windows 和 Linux 文件系统工作
在 Windows 和 Linux 文件系统之间工作时,需要牢记一些注意事项。 本指南介绍了一部分示例,包括一些混合使用基于 Windows 和 Linux 的命令的互操作性支持示例。
跨文件系统的文件存储和性能
建议不要跨操作系统使用文件,除非有这么做的特定原因。 若想获得最快的性能速度,请将文件存储在 WSL 文件系统中,前提是在 Linux 命令行(Ubuntu、OpenSUSE 等)中工作。 如果使用 Windows 命令行(PowerShell、命令提示符)工作,请将文件存储在 Windows 文件系统中。
例如,在存储 WSL 项目文件时:
- 使用 Linux 文件系统根目录:
/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$
文件名和目录区分大小写
区分大小写确定在文件名或目录中是将大写 (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 会话后,禁用互操作的结果不会持久保留 -- 启动新会话后,会再次启用互操作。