Executando o programa Win32 do Bash para Windows 10

2

Eu recebi a atualização mais recente do Windows que adiciona o bash e estava tentando fazer o script da execução de um emulador Android por meio disso; no entanto, as variáveis Path do Windows não são levadas em conta para o bash.

Além disso, tentei executar manualmente o adb e obtive:

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

Há algo que estou sentindo falta aqui? Eu quero usar este computador com Windows como um servidor de teste para o Android.

    
por Gabriel Sanmartin 08.09.2016 / 10:28

1 resposta

5

TL; DR: A Microsoft não fez inicialmente possibilitar a execução do Windows Apps.

A partir do Insider Preview build 14951, anunciado em 19 de outubro de 2016, você pode executar programas nativos do Windows a partir do Bash no Ubuntu no Windows (WSL)

Windows binaries can now be invoked directly from the WSL command line. This gives users the ability to interact with their Windows environment and system in a way that has not been possible. As a quick example, it is now possible for users to run the following commands:

$ 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

link

O anúncio dizia

Windows Subsystem for Linux: Today we are happy to announce two large updates to WSL!

  • Official Ubuntu 16.04 support. Ubuntu 16.04 (Xenial) is installed for all new Bash on Ubuntu on Windows instances starting in build 14951. This replaces Ubuntu 14.04 (Trusty). Existing user instances will not be upgraded automatically. Users on the Windows Insider program can upgrade manually from 14.04 to 16.04 using the do-release-upgrade command.

  • Windows / WSL interoperability. Users can now launch Windows binaries directly from a WSL command prompt. This is the number one request from our users on the WSL User Voice page.

(minha ênfase)

Causa do erro

A mensagem

cannot execute binary file: Exec format error

Isso significa que o Bash está convencido de que o adb.exe é o tipo errado de arquivo para execução.

Para descobrir por que, tente usar:

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

Por exemplo:

$ 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 para Linux

Observe que os objetivos iniciais da WSL da Microsoft

foram

Using Bash, you can run command-line Linux tools and apps.

Observe que não inclui

  • ferramentas e aplicativos gráficos do Linux (X11).
  • Ferramentas e aplicativos do Windows.

binários de 32 bits

Acredito que o Windows Subsystem for Linux (WSL) da Microsoft atualmente suporta apenas binários ELF de 64 bits, não binários ELF de 32 bits.

Binários do Windows

Além disso, de esta pergunta parece que o WSL no momento de escrever esta resposta não suporte a execução de executáveis do Windows a partir do Bash.

Isso é confirmado por HowtoGeek

Unfortunately, there’s no way to actually launch a Windows program or run a Windows command from within a Bash script or the Bash shell. However, you can incorporate Bash commands into a Batch script or PowerShell script

Por que não: - (

Se você observar como a Microsoft fez isso, verá que Bash.exe é um aplicativo nativo do modo de console do Windows que, na minha opinião, atua basicamente como um front end muito fino que se comunica com um não modificado /bin/bash que faz toda a interpretação e execução dos comandos.

WSL ... is primarily comprised of:

  • User mode session manager service that handles the Linux instance life cycle
  • Pico provider drivers (lxss.sys, lxcore.sys) that emulate a Linux kernel by translating Linux syscalls
  • Pico processes that host the unmodified user mode Linux (e.g. /bin/bash)

enter image description here
- WSL Overview

Como um / bin / bash não modificado não espera poder executar programas que não são nativos do Linux "ELF" binários, ele se opõe aos binários "PE" do Windows.

Eu certamente não quero acabar com o buraco da corrida do WINE sob a WSL. Eu sugiro que você evite essa ideia também.

Solução possível

Veja o projeto cbwin

Launch Windows programs from "Bash on Ubuntu on Windows" (WSL)

main features:

  • Win32 command line tools in the console, invoked from WSL
  • Win32 command line tools with redirections to WSL (stdin/stdout/stderr to or from pipe/file)
  • suspend/resume propagation (Ctrl-Z suspends the Win32 processes, fg resumes them)
  • exit codes propagation
  • launch "detached" GUI Windows programs (uses start of cmd)
    
por 08.09.2016 / 12:12