问题描述
随着2016年夏季的Windows 10周年更新,可以在新的Windows Subsystem for Linux (WSL)(“lightweight”虚拟化子系统)中运行ubuntu二进制文件。
不幸的是,启动C:\Windows\System32\bash.exe
,另一个bash
ELF二进制文件启动了WSL内部的进程,从那里你无法逃脱!您可以只启动其他ELF二进制文件。
那么如何从Windows Bash执行*.exe
文件?[1]
[1]问题也在Microsoft’s “official” GH support repo中提出。
最佳解决方法
原生解决方案
Windows 10 Insider预览更新(14951)提供的官方解决方案基于几乎被遗忘的用于启动二进制文件的binfmt_msc Linux工具。 binfmt_misc的注册命令是这样的(其中/init
是win-executables的临时binfmt_misc “interpreter”):
sudo echo ":WSLInterop:M::MZ::/init:" > /proc/sys/fs/binfmt_misc/register
然后win-executable将像常规程序一样启动:
$ export PATH=$PATH:/mnt/c/Windows/System32
$ notepad.exe
$ ipconfig.exe | grep IPv4 | cut -d: -f2
$ ls -la | findstr.exe foo.txt
$ cmd.exe /c dir
Not that any win-executable must reside in the windows (DrvFs) file-system – not on the Linux’s file-system (VolFs) – in order to inherit a proper Windows working-directory.
cbwin替代品
直到获得最新版本,项目cbwin通过在WSL中安装3个新的linux命令提供了一种解决方法:
-
wcmd
:通过cmd.exe
调用win-executable。 -
wrun
:与CreateProcess
同步调用win-executable,等待死亡(不使用cmd.exe
)。 -
wstart
:启动分离(异步)命令(使用cmd.exe
)。
要使用它们,您必须:
-
安装cbwin:
-
新的
outbash.exe
将安装在常规Windows文件系统(%PATH%
中的某个位置),以及 -
WSL文件系统中的3 linux-commands。
-
-
使用此
outbash.exe
(无论您在何处安装)都可以启动WSL,而不是C:\Windows\System32\bash.exe
! -
使用其中一个命令为任何win-executables添加前缀,例如:
wrun notepad
。
提示:如果使用wcmd
或wrun
启动的可执行文件生成任何子项,则这些子项只能在可执行文件保持活动状态的时间内存活。
换句话说,尝试使用wcmd
启动notepad.exe
将无法工作,因为记事本将在启动后立即被杀死 – 在这种情况下使用wrun
(同步)或wstart
(异步)。
次佳解决方法
在Windows 10 Creators Update(build 1703,2017年4月)中,这是本机支持的。所以你现在可以从Linux运行Windows二进制文件了…
……反之亦然:
有关更多信息,请参阅上面链接的文章。
第三种解决方法
从命令行运行.exe
时,从PHP通过exec()
运行时,我无法使用它。但是,添加/init
确实有效。这是我在Windows上安装的GraphicsMagick的/usr/local/bin/convert
文件:
#!/bin/sh
/init "$(ls /mnt/c/Program*/GraphicsMagick*/gm.exe|tail -1)" convert "$@"