在 Windows 10 中从 Bash 运行 Win32 程序

在 Windows 10 中从 Bash 运行 Win32 程序

我从 Windows 获得了添加了 bash 的最新更新,并且我试图通过它编写 Android 模拟器的执行脚本;但是 Windows 的 Path 变量并未被 bash 考虑在内。

另外,我尝试手动执行 adb,得到以下结果:

andtest@DESKTOP:/mnt/c/Android/sdk/platform-tools$ exec ./adb.exe
bash: /mnt/c/Android/sdk/platform-tools/adb.exe: cannot execute binary file: Exec format error

我是不是漏掉了什么?我想将这台 Windows 电脑用作 Android 的测试服务器。

答案1

TL;DR:微软没有最初使得运行 Windows 应用程序成为可能。

从 2016 年 10 月 19 日发布的 Insider Preview 版本 14951 开始,您可以在 Windows 下的 Ubuntu 中通过 Bash 运行原生 Windows 程序(WSL)

现在可以直接从 WSL 命令行调用 Windows 二进制文件。这使用户能够以前所未有的方式与他们的 Windows 环境和系统进行交互。举一个简单的例子,现在用户可以运行以下命令:

$ 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

https://msdn.microsoft.com/en-us/commandline/wsl/release_notes#build-14951

公告称

适用于 Linux 的 Windows 子系统:今天我们很高兴地宣布 WSL 的两个重大更新!

  • 官方支持 Ubuntu 16.04。从版本 14951 开始,所有新的 Windows 实例上的 Ubuntu 上的 Bash 都安装了 Ubuntu 16.04 (Xenial)。这将取代 Ubuntu 14.04 (Trusty)。 现有用户实例不会自动升级。Windows Insider 计划的用户可以使用 do-release-upgrade 命令手动从 14.04 升级到 16.04。

  • Windows / WSL 互操作性。用户现在可以直接从 WSL 命令提示符启动 Windows 二进制文件。这是 WSL User Voice 页面上用户提出的第一个请求。

(我强调)


错误原因

讯息

无法执行二进制文件:执行格式错误

这意味着 Bash 确信 adb.exe 是错误类型的文件,不适合执行。

要找出原因,请尝试使用:

file /mnt/c/Android/sdk/platform-tools/adb.exe

例如:

$ pwd
/mnt/c/Windows/System32
$ ./notepad.exe
bash: ./notepad.exe: cannot execute binary file: Exec format error
$ file notepad.exe
notepad.exe: PE32+ executable (GUI) x86-64, for MS Windows

适用于 Linux 的 Windows 子系统

请注意,微软的WSL 的初始目标

使用 Bash,您可以运行命令行 Linux 工具和应用程序。

请注意不包括

  • 图形化(X11)Linux 工具和应用程序。
  • Windows 工具和应用程序。

32 位二进制文​​件

我相信微软的 Windows Subsystem for Linux(WSL)目前仅支持 64 位 ELF 二进制文件,而不支持 32 位 ELF 二进制文件。


Windows 二进制文件

另外,来自这个问题似乎 WSL在写这个答案的时候不支持在 Bash 内部运行 Windows 可执行文件。

证实HowtoGeek

不幸的是,没有办法在 Bash 脚本或 Bash shell 中真正启动 Windows 程序或运行 Windows 命令。但是,你可以将 Bash 命令合并到批处理脚本或 PowerShell 脚本中


为什么不 :-(

如果你看看微软是如何做到这一点的,你会发现这Bash.exe是一个原生的 Windows 控制台模式应用程序,我相信它基本上充当了一个非常薄的前端,可以与未修改 /bin/bash它负责所有命令的实际解释和执行。

WSL...主要包括:

  • 处理 Linux 实例生命周期的用户模式会话管理器服务
  • Pico 提供程序驱动程序(lxss.sys、lxcore.sys)通过转换 Linux 系统调用来模拟 Linux 内核
  • Pico 进程承载着未修改用户模式Linux(例如/bin/bash

在此处输入图片描述
-WSL 概述

由于未修改的 /bin/bash 无法运行非原生 Linux 的程序“精灵”二进制文件,它反对 Windows“PE”二进制文件。

我当然不想陷入在 WSL 下运行 WINE 的泥潭。我建议你也不要这么做。


可能的解决方案

项目cbwin

从“Windows 上的 Ubuntu 上的 Bash”(WSL)启动 Windows 程序

主要特点:

  • 控制台中的 Win32 命令行工具,从 WSL 调用
  • 带有重定向到 WSL 的 Win32 命令行工具(stdin/stdout/stderr 到或来自管道/文件)
  • 暂停/恢复传播(Ctrl-Z 暂停 Win32 进程,fg 恢复它们)
  • 退出代码传播
  • 启动“分离的” GUI Windows 程序(使用 cmd 的启动)

相关内容