55

随着2016 年夏季的Windows 10 周年更新,可以在新的Windows Linux 子系统 (WSL)中运行ubuntu二进制文件,这是一个“轻量级”虚拟化子系统。

不幸的是,启动C:\Windows\System32\bash.exe另一个bashELF 二进制文件会在 WSL 中启动一个进程,您无法从中逃脱!您只能启动其他 ELF 二进制文件。

那么如何*.exe从 Windows Bash 执行文件呢?[1]

[1] Microsoft 的“官方”GH 支持 repo中也提出了问题。

4

5 回答 5

56

Windows 10 创意者更新(内部版本 1703,2017 年 4 月)中,这是本机支持的。因此,您现在可以从 Linux 运行 Windows 二进制文件...

notepad.exe或任何其他.exe(需要扩展并且它需要在你的路径上,一些旧版本需要整个路径)

...反之亦然,使用以下方法之一:

  • bash.exe -c command_to_runIE:bash.exe -c ls
  • bash -c command_to_runIE:bash -c ls
  • wsl command_to_run即:wsl "ls"; 或指定要用于运行它的发行版:
    • ubuntu run ls

有关详细信息,请参阅上面链接的文章。

于 2017-12-05T21:53:32.577 回答
38

原生解决方案

Windows 10 Insider Preview Update (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:通过cmd.exe.
  • wrun:与 同步调用 win 可执行文件CreateProcess,然后等待死亡(不使用cmd.exe)。
  • wstart: 启动一个分离的(异步)命令(使用cmd.exe)。

为了使用它们,您必须:

  1. 安装cbwin
    • 一个新的outbash.exe将安装在您的常规 Windows 文件系统中(在您的%PATH%.
    • WSL 文件系统中的 3 个 linux 命令。
  2. 使用它outbash.exe(无论您安装在哪里)来启动 WSL,而不是C:\Windows\System32\bash.exe
  3. 使用这些命令之一为任何 win 可执行文件添加前缀,例如wrun notepad.

提示:如果可执行文件与任何子代一起启动wcmdwrun产生任何子代,则这些子代仅在该可执行文件仍然存在时才存在。

换句话说,尝试开始notepad.exewcmd行不通的,因为记事本将在启动后立即被杀死——在这种情况下使用wrun(同步)或wstart(异步)。

于 2016-08-12T14:44:08.730 回答
3

为什么不直接使用

$ powershell.exe Start filename

Start是 Windows 相当于xdg-open大多数 linux 或openmacOS 上的,这意味着“使用默认桌面应用程序打开”。我喜欢给它起别名来打开。

于 2020-08-17T18:52:27.433 回答
3

.exe从命令行运行时,当从 PHP 运行时,exec()我无法让它工作。/init但是,添加确实有效。这是我/usr/local/bin/convert在 Windows 上安装的 GraphicsMagick 的工作文件:

#!/bin/sh
/init "$(ls /mnt/c/Program*/GraphicsMagick*/gm.exe|tail -1)" convert "$@"
于 2018-12-18T19:59:33.577 回答
0

我对此有点困惑。我添加了一个符号链接:

$ 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 是否有实现符号链接的错误?

于 2019-12-03T00:05:32.793 回答