适用于 Linux 的 Windows 子系统 (WSL) 正在持续改进 Windows 与 Linux 之间的集成。 您可以:

  1. 从 Linux 控制台调用 Windows 二进制文件。
  2. 从 Windows 控制台调用 Linux 二进制文件。
  3. Windows 预览体验成员内部版本 17063+ 在 Linux 与 Windows 之间共享环境变量。

一、在Windows中使用WSL中的命令

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

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

  1. 使用当前 CMD 或 PowerShell 提示符中提到的同一工作目录。
  2. 以 WSL 默认用户的身份运行。
  3. 拥有与调用方进程和终端相同的 Windows 管理权限。

例如:

  1. C:\temp> wsl ls -la

wsl.exe 后面的 Linux 命令的处理方式与 WSL 中运行的任何命令的处理方式类似。 可以执行 sudo、管道处理和文件重定向等操作。

使用 sudo 的示例:

  1. C:\temp> wsl sudo apt-get update
  2. [sudo] password for username:
  3. Hit:1 https://archive.ubuntu.com/ubuntu xenial InRelease
  4. Get:2 https://security.ubuntu.com/ubuntu xenial-security InRelease [94.5 kB]

混合 WSL 和 Windows 命令的示例:

  1. C:\temp> wsl ls -la | findstr "foo"
  2. -rwxrwxrwx 1 root root 14 Sep 27 14:26 foo.bat
  3. C:\temp> dir | wsl grep foo
  4. 09/27/2016 02:26 PM 14 foo.bat
  5. C:\temp> wsl ls -la > out.txt

传入 wsl.exe 的命令将按原样转发到 WSL 进程。 文件路径必须以 WSL 格式指定。

使用路径的示例:

  1. C:\temp> wsl ls -la /proc/cpuinfo
  2. -r--r--r-- 1 root root 0 Sep 28 11:28 /proc/cpuinfo
  3. C:\temp> wsl ls -la "/mnt/c/Program Files"
  4. <- contents of C:\Program Files ->

二、在WSL中使用Windows中的命令

WSL 可以使用 [binary name].exe 直接从 WSL 命令行调用 Windows 二进制文件。 例如,notepad.exe。 为使 Windows 可执行文件更易于运行,Windows 路径将包含在 Fall Creators Update 中的 Linux $PATH 内。

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

  1. 按 WSL 命令提示保留工作目录(大部分情况下是这样 — 下面所述的情况除外)。
  2. 拥有与 WSL 进程相同的权限。
  3. 以活动 Windows 用户的身份运行。
  4. 显示在 Windows 任务管理器中,就如同直接从 CMD 提示符执行的一样。

例如:

  1. $ notepad.exe

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

使用管道的示例:

  1. $ ipconfig.exe | grep IPv4 | cut -d: -f2
  2. 172.21.240.1
  3. 10.159.21.24

使用混合 Windows 和 WSL 命令的示例:

  1. $ ls -la | findstr.exe foo.txt

Windows 二进制文件必须包含文件扩展名,匹配文件大小写,并且可执行。 包含批处理脚本的不可执行文件。 dir 等 CMD 本机命令可与 cmd.exe /c 命令一起运行。

示例:

  1. $ cmd.exe /c dir
  2. <- contents of C:\ ->
  3. $ ping.exe www.microsoft.com
  4. Pinging e1863.dspb.akamaiedge.net [2600:1409:a:5a2::747] with 32 bytes of data:
  5. Reply from 2600:1409:a:5a2::747: time=2ms

参数将按原样传递到 Windows 二进制文件。

例如,以下命令将在 C:\temp\foo.txt 中打开 notepad.exe

  1. $ notepad.exe "C:\temp\foo.txt"
  2. $ notepad.exe C:\\temp\\foo.txt

不支持使用 WSL 中的 Windows 应用程序修改位于 VolFs 中的文件(不是在 /mnt/ 下的文件)。

默认情况下,WSL 会尝试将 Windows 二进制文件的工作目录保留为当前的 WSL 目录,但如果工作目录位于 VolFs 中,则会回退到实例创建目录。

例如,wsl.exe 最初是从 C:\temp 启动的,而当前 WSL 目录已更改为用户的主目录。 如果从用户的主目录调用 notepad.exe,WSL 将自动还原到 C:\temp(notepad.exe 工作目录):

  1. C:\temp> wsl
  2. /mnt/c/temp/$ cd ~
  3. ~$ notepad.exe foo.txt
  4. ~$ ls | grep foo.txt
  5. ~$ exit
  6. exit
  7. C:\temp>dir | findstr foo.txt
  8. 09/27/2016 02:15 PM 14 foo.txt

三、访问WSL中的目录结构

通过以下格式的路径就可以访问Linux子系统中的文件了:

  1. \\WSL$\<Linux子系统名称>\<文件path>

示例:

  1. PS C:\Windows\System32> wsl -l
  2. 适用于 Linux Windows 子系统分发版:
  3. Ubuntu (默认)
  4. docker-desktop
  5. docker-desktop-data
  6. PS C:\Windows\System32> dir \\wsl$\ubuntu
  7. 目录: \\wsl$\ubuntu
  8. Mode LastWriteTime Length Name
  9. ---- ------------- ------ ----
  10. d----- 2020-08-05 05:47 boot
  11. d----- 2020-09-30 22:35 dev
  12. d----- 2020-09-30 22:35 etc
  13. d----- 2020-09-21 22:09 home
  14. d----- 2020-08-05 05:39 media
  15. d----- 2020-09-21 22:08 mnt
  16. d----- 2020-08-05 05:39 opt
  17. d----- 2020-09-30 22:35 proc
  18. d----- 2020-08-05 05:42 root
  19. d----- 2020-09-30 22:35 run
  20. d----- 2020-07-10 21:59 snap
  21. d----- 2020-08-05 05:39 srv
  22. d----- 2020-09-30 22:35 sys
  23. d----- 2020-09-21 22:13 tmp
  24. d----- 2020-08-05 05:40 usr
  25. d----- 2020-08-05 05:42 var
  26. -----l 2020-08-05 05:39 7 bin
  27. ------ 2020-08-15 16:34 631968 init
  28. -----l 2020-08-05 05:39 7 lib
  29. -----l 2020-08-05 05:39 9 lib32
  30. -----l 2020-08-05 05:39 9 lib64
  31. -----l 2020-08-05 05:39 10 libx32
  32. -----l 2020-08-05 05:39 8 sbin
  33. PS C:\Windows\System32> dir \\wsl$\ubuntu\mnt
  34. 目录: \\wsl$\ubuntu\mnt
  35. Mode LastWriteTime Length Name
  36. ---- ------------- ------ ----
  37. d----- 2020-09-28 21:22 c
  38. d----- 2020-09-24 12:19 d
  39. d----- 2020-09-21 21:59 e
  40. d----- 2020-09-22 20:00 f
  41. d----- 1980-01-01 00:00 g

可以看出,在WSL中观察Windows的文件路径是以/mnt/开始,之后是盘符,如C盘就是 /mnt/c/,之后是文件路径了。

参考资料