与2016年夏天的 Windows 10周年更新一起,可以在新的Windows Subsystem for Linux (WSL)内运行 ubuntu 二进制文件,"轻量级&# 34;虚拟化子系统。
不幸的是,启动C:\Windows\System32\bash.exe
,另一个bash
ELF二进制文件在WSL中启动一个进程,从那里你无法逃脱!您可以只启动其他ELF二进制文件。
那么如何从Windows Bash执行*.exe
文件?[1]
[1]问题也在Microsoft's "official" GH support repo中提出。
答案 0 :(得分:22)
Windows 10 Insider Preview Update (14951)提供的官方解决方案基于几乎被遗忘的用于启动二进制文件的binfmt_msc Linux工具。 binfmt_misc 的注册命令将是这样的(其中/init
是临时 binfmt_misc "解释器"用于win-executables):
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
并非任何win-executable必须驻留在Windows( DrvFs )文件系统中 - 而不是Linux的文件系统( VolFs ) - 为了继承正确的 Windows 工作目录。
直到你得到最新版本,项目cbwin提供了一种解决方法,在WSL中安装了3个新的linux命令:
wcmd
:通过cmd.exe
调用win-executable。 wrun
:与CreateProcess
同步调用win-executable,等待死亡(不使用cmd.exe
)。 wstart
:启动分离(异步)命令(使用cmd.exe
)。要使用它们,您必须:
outbash.exe
将安装在您的常规Windows文件系统中(%PATH%
中的某个位置),再加上outbash.exe
(无论您在何处安装)都可以启动WSL,而不是C:\Windows\System32\bash.exe
!wrun notepad
。 提示:如果使用wcmd
或wrun
启动的可执行文件会生成任何子项,那么只有在可执行文件保持活动状态的情况下才能生存。
换句话说,尝试使用notepad.exe
启动wcmd
无法正常工作,因为 notepad 将在启动后被杀死 - 使用{{在这种情况下,1}}(同步)或wrun
(异步)。
答案 1 :(得分:19)
在Windows 10 Creators Update(版本1703,2017年4月)中,本机支持此功能。所以你现在可以从Linux运行Windows二进制文件......
......反之亦然:
有关详细信息,请参阅上面的链接文章。
答案 2 :(得分:2)
虽然从命令行运行.exe
可以正常工作,但是当通过exec()
从PHP运行时,我无法正常工作。但是,添加/init
确实可以。这是我在Windows上安装的GraphicsMagick的/usr/local/bin/convert
工作文件:
#!/bin/sh
/init "$(ls /mnt/c/Program*/GraphicsMagick*/gm.exe|tail -1)" convert "$@"
答案 3 :(得分:0)
我对此有些困惑。我添加了一个符号链接:
$ ls -l /c
lrwxrwxrwx 1 root root 5 Dec 3 10:24 /c -> mnt/c
现在ls / c给出的结果与ls / mnt / c
相同但是现在: / c /程序\文件/Java/jdk1.8.0_211/bin/java.exe -version ==>没事
但是:
/mnt/c/Program\ Files/Java/jdk1.8.0_211/bin/java.exe -version
java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
其他Windows可执行文件也发生同样的情况。 WSL是否有实现符号链接的错误?
答案 4 :(得分:0)
为什么不只是使用
$ powershell.exe Start filename
Start
是Windows,相当于大多数Linux上的xdg-open
或macOS上的open
,表示“使用默认桌面应用程序打开”。我想为它打开别名。