如何从 WSL(Ubuntu)Bash 运行 Windows 可执行文件
- 2024-10-29 08:35:00
- admin 原创
- 71
问题描述:
随着2016 年夏季Windows 10 周年更新的推出,人们可以在新的“轻量级”虚拟化子系统Windows Linux 子系统 (WSL)中运行ubuntu二进制文件。
不幸的是,启动C:WindowsSystem32ash.exe
另一个bash
ELF 二进制文件会启动 WSL 内部的一个进程,您无法从中退出!您只能启动其他 ELF 二进制文件。
那么我怎样才能*.exe
从 Windows Bash 执行文件?[1]
[1]微软“官方” GH 支持 repo中也提出了这个问题。
解决方案 1:
在Windows 10 Creators Update(版本 1703,2017 年 4 月)中,此功能已得到原生支持。因此,您现在可以从 Linux 运行 Windows 二进制文件...
notepad.exe
或任何其他.exe
(需要扩展,并且需要位于您的路径上,某些旧版本需要完整路径)
...反之亦然,使用下列方法之一:
bash.exe -c command_to_run
IE:bash.exe -c ls
bash -c command_to_run
IE:bash -c ls
wsl command_to_run
即:wsl "ls"
;或者使用以下命令指定您想要使用的发行版:ubuntu run ls
欲了解更多信息,请参阅上面链接的文章。
解决方案 2:
原生解决方案
Windows 10 Insider Preview 更新(14951)提供的官方解决方案基于几乎被遗忘的binfmt_msc Linux 工具,用于启动二进制文件。binfmt_misc的注册命令如下(win-executables 的/init
临时binfmt_misc “解释器”在哪里):
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 可执行文件都必须驻留在 windows(DrvFs)文件系统中 - 而不是 Linux 的文件系统(VolFs)中 - 为了继承正确的Windows工作目录。
cbwin替代方案
在你获得最新版本之前,项目cbwin提供了一种解决方法,即在 WSL 中安装 3 个新的 Linux 命令:
wcmd
:通过 调用 win-executablecmd.exe
。wrun
:使用 同步调用 win 可执行文件CreateProcess
,并等待死亡(不使用cmd.exe
)。wstart
:启动一个分离的(异步)命令(使用cmd.exe
)。
为了使用它们,您必须:
安装cbwin:
* 一个新的`outbash.exe`将安装在您的常规 Windows 文件系统中(在您的某个位置`%PATH%`),加上
* WSL 文件系统中的 3 个 linux 命令。
使用它
outbash.exe
(无论你在哪里安装它)来启动 WSL,而不是C:WindowsSystem32ash.exe
!在任何 win-executables 前面加上其中一个命令,例如
wrun notepad
。
提示:如果可执行文件随其一起启动wcmd
或者wrun
产生了任何子项,那么这些子项只会在该可执行文件存活期间存活。
换句话说,尝试notepad.exe
以wcmd
不工作的方式启动,因为记事本在启动后就会被杀死——在这种情况下使用wrun
(同步)或wstart
(异步)。
解决方案 3:
为什么不直接使用
$ powershell.exe Start filename
Start
是 Windows 上与xdg-open
大多数 Linux 或open
macOS 上的等价物,意思是“使用默认桌面应用程序打开”。我喜欢将其别名为 open。
解决方案 4:
我使用别名。
alias aws="/mnt/c/Program Files/Amazon/AWSCLIV2//aws.exe"
alias kubectl="/mnt/c/ProgramData/chocolatey/bin/kubectl.exe"
alias kubectx="/mnt/c/ProgramData/chocolatey/bin/kubectx.exe"
alias kubens="/mnt/c/ProgramData/chocolatey/bin/kubens.exe"
alias pytest=pytest.exe
解决方案 5:
虽然.exe
从命令行运行 可以,但从 PHP 运行 时却exec()
无法让它工作。/init
但是,添加 可以工作。这是我/usr/local/bin/convert
在 Windows 上安装的 GraphicsMagick 的工作文件:
#!/bin/sh
/init "$(ls /mnt/c/Program*/GraphicsMagick*/gm.exe|tail -1)" convert "$@"
解决方案 6:
我对此有点困惑。我添加了一个符号链接:
$ ls -l /c
lrwxrwxrwx 1 root root 5 Dec 3 10:24 /c -> mnt/c
现在 ls /c 给出的结果与 ls /mnt/c 相同
但是现在:/c/Program\ Files/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 在实现符号链接时是否存在错误?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件