2

Я получил последнее обновление от Windows, которое добавляет bash, и я пытался написать сценарий выполнения эмулятора Android; однако переменные Path в Windows не учитываются для 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 ответ1

5

TL; DR: Microsoft изначально не позволяла запускать приложения для Windows.

Начиная с версии Insider Preview 14951, объявленной 19 октября 2016 года, вы можете запускать собственные программы Windows из Bash под Ubuntu под Windows (WSL)

Двоичные файлы Windows теперь можно вызывать непосредственно из командной строки WSL. Это дает пользователям возможность взаимодействовать со своей средой и системой 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

В объявлении сказано

Подсистема Windows для Linux: Сегодня мы рады объявить о двух больших обновлениях WSL!

  • Официальная поддержка Ubuntu 16.04. Ubuntu 16.04 (Xenial) устанавливается для всех новых Bash в Ubuntu на экземплярах Windows, начиная с сборки 14951. Это заменяет Ubuntu 14.04 (Trusty). Существующие пользовательские экземпляры не будут обновлены автоматически. Пользователи программы Windows Insider могут выполнить обновление вручную с 14.04 до 16.04 с помощью команды do-release-upgrade.

  • Совместимость Windows / WSL. Теперь пользователи могут запускать двоичные файлы Windows непосредственно из командной строки WSL. Это запрос номер один от наших пользователей на странице «Голос пользователя WSL».

(мой акцент)


Причина ошибки

Сообщение

невозможно выполнить двоичный файл: ошибка формата Exec

Это означает, что 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

Windows Susbsystem для Linux

Обратите внимание, что первоначальные цели Microsoft для WSL были

Используя Bash, вы можете запускать инструменты и приложения Linux для командной строки.

Обратите внимание, что не включает

  • графические (X11) инструменты и приложения для Linux.
  • Инструменты и приложения для Windows.

32-битные двоичные файлы

Я считаю, что подсистема Microsoft Windows для Linux (WSL) в настоящее время поддерживает только 64-разрядные двоичные файлы ELF, а не 32-разрядные двоичные файлы ELF.


Двоичные файлы Windows

Кроме того, из этого вопроса кажется, что WSL на момент написания этого ответа не поддерживал запуск исполняемых файлов Windows из Bash.

Это подтверждается HowtoGeek

К сожалению, на самом деле нет способа запустить программу Windows или выполнить команду Windows из скрипта Bash или оболочки Bash. Однако вы можете включить команды Bash в пакетный скрипт или скрипт PowerShell


Почему бы и нет :-(

Если вы посмотрите на то, как Microsoft сделала это, вы увидите, что Bash.exe является родным приложением для консольного режима Windows, которое, как мне кажется, в основном действует как очень тонкий интерфейс, который связывается с неизмененным /bin/bash который выполняет все интерпретация и исполнение команд.

WSL ... в основном состоит из:

  • Служба диспетчера сеансов в пользовательском режиме, которая обрабатывает жизненный цикл экземпляра Linux
  • Драйверы поставщика Pico (lxss.sys, lxcore.sys), которые эмулируют ядро Linux, переводя системные вызовы Linux
  • Процессы Pico, в которых размещается немодифицированный пользовательский режим Linux (например, /bin/bash)


- Обзор WSL

Поскольку немодифицированный /bin /bash не ожидает запуска программ, которые не являются собственными двоичными файлами Linux "ELF" , он возражает против двоичных файлов Windows PE .

Я, конечно, не хочу бегать по кроличьей норе в WINE под WSL. Я предлагаю вам избежать этой идеи тоже.


Возможное решение

Посмотреть проект cbwin

Запустите программы Windows из "Bash на Ubuntu в Windows" (WSL)

Основные функции:

  • Инструменты командной строки Win32 в консоли, вызываемые из WSL
  • Инструменты командной строки Win32 с перенаправлениями на WSL (stdin/stdout/stderr в / из pipe / file)
  • приостановить / возобновить распространение (Ctrl-Z приостанавливает процессы Win32, fg возобновляет их)
  • распространение кодов выхода
  • запускать "отсоединенные" программы Windows с графическим интерфейсом (использует запуск cmd)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .