我从 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 可执行文件。
不幸的是,没有办法在 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)
由于未修改的 /bin/bash 无法运行非原生 Linux 的程序“精灵”二进制文件,它反对 Windows“PE”二进制文件。
我当然不想陷入在 WSL 下运行 WINE 的泥潭。我建议你也不要这么做。
可能的解决方案
从“Windows 上的 Ubuntu 上的 Bash”(WSL)启动 Windows 程序
主要特点:
- 控制台中的 Win32 命令行工具,从 WSL 调用
- 带有重定向到 WSL 的 Win32 命令行工具(stdin/stdout/stderr 到或来自管道/文件)
- 暂停/恢复传播(Ctrl-Z 暂停 Win32 进程,fg 恢复它们)
- 退出代码传播
- 启动“分离的” GUI Windows 程序(使用 cmd 的启动)