从 Bash for Windows 10 运行 Win32 程序

Gab*_*tin 2 bash android windows-10 windows-subsystem-for-linux

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

另外,我尝试手动执行 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
Run Code Online (Sandbox Code Playgroud)

有什么我在这里想念的吗?我想将此 Windows 计算机用作 Android 的测试服务器。

Red*_*ick 5

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

自 2016 年 10 月 19 日发布的 Insider Preview 版本 14951 起,您可以在 Windows (WSL) 下的 Ubuntu 下从 Bash 运行本机 Windows 程序

现在可以直接从 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 支持。Ubuntu 16.04 (Xenial) 安装在 Windows 实例上的所有新 Bash 上,从 build 14951 开始。这取代了 Ubuntu 14.04 (Trusty)。 现有的用户实例不会自动升级。Windows Insider 程序上的用户可以使用 do-release-upgrade 命令手动从 14.04 升级到 16.04。

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

(我的重点)


错误原因

消息

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

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

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

file /mnt/c/Android/sdk/platform-tools/adb.exe
Run Code Online (Sandbox Code Playgroud)

例如:

$ 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
Run Code Online (Sandbox Code Playgroud)

适用于 Linux 的 Windows 子系统

请注意,Microsoft最初的 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 实例生命周期的用户模式会话管理器服务
  • 通过转换 Linux 系统调用来模拟 Linux 内核的 Pico 提供程序驱动程序(lxss.sys、lxcore.sys)
  • 托管未修改用户模式 ​​Linux 的Pico 进程(例如/bin/bash

在此处输入图片说明
- WSL 概述

由于未修改的 /bin/bash 不希望能够运行不是本机 Linux “ELF”二进制文件的程序,因此它反对 Windows “PE”二进制文件。

我当然不想在 WSL 下运行 WINE 的兔子洞。我建议你也避免这个想法。


可能的解决方案

查看项目 cbwin

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

主要特点:

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