在 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
若要在 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 分发版而创建)。