wslstore subsistema installed home has for distributions aka linux windows bash ubuntu windows-subsystem-for-linux

subsistema - windows subsystem for linux



¿Cómo se puede ejecutar un ejecutable de Windows desde WSL(Ubuntu) Bash? (3)

Solución nativa

La solución oficial provista con Windows 10 Insider Preview Update (14951) se basa en la facilidad casi olvidada binfmt_msc Linux para lanzar binarios. El comando de registro para el binfmt_misc sería así (donde /init es el "intérprete" provisional de binfmt_misc para los ejecutables win):

sudo echo ":WSLInterop:M::MZ::/init:" > /proc/sys/fs/binfmt_misc/register

Y luego se ejecutaría Win-Ejecutable como programas regulares:

$ 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

No es que ningún ejecutable de Windows debe residir en el sistema de archivos de Windows ( DrvFs ), no en el sistema de archivos de Linux ( VolFs ), para heredar un directorio de trabajo de Windows adecuado.

La alternativa de cbwin

Hasta que obtenga la última versión, el proyecto cbwin ofrece una solución al instalar 3 nuevos comandos de Linux dentro de WSL:

  • wcmd : llame a un ejecutable win a través de cmd.exe .
  • wrun : llame a un ejecutable win sincrónicamente con CreateProcess y espere a morir (sin usar cmd.exe ).
  • wstart : wstart un comando separado (asíncronamente) (con el uso de cmd.exe ).

Para utilizarlos, debes:

  1. Instala cbwin :
    • se instalará un nuevo outbash.exe en su sistema de archivos regular de Windows (en algún lugar de su %PATH% ), más
    • Los 3 comandos de linux en el sistema de archivos WSL.
  2. Use este outbash.exe (donde sea que lo instaló) para iniciar WSL, NO C:/Windows/System32/bash.exe .
  3. Prefija cualquier archivo ejecutable con uno de esos comandos, por ejemplo, el wrun notepad .

Sugerencia: si el ejecutable lanzado con wcmd o wrun genera algún hijo, estos sobreviven solo mientras el ejecutable permanezca vivo.

En otras palabras, tratar de iniciar notepad.exe con wcmd no funcionará, ya que el bloc de notas se wrun justo después de haber sido lanzado. En este caso, utilice wrun (sincrónicamente) o wstart (asincrónicamente).

Junto con la actualización de Windows 10 Aniversario para el verano de 2016, surgió la posibilidad de ejecutar binarios de ubuntu dentro del nuevo Subsistema de Windows para Linux (WSL) , un subsistema virtualizado "liviano".

Desafortunadamente, al iniciar C:/Windows/System32/bash.exe , ¡otro binario bash ELF inicia un proceso dentro de WSL, desde donde no puede escapar! Puedes lanzar solo otros binarios ELF.

Entonces, ¿cómo puedo ejecutar archivos *.exe desde Windows Bash? [1]

[1] Pregunta formulada también en el repositorio de soporte de GH "oficial" de Microsoft .


En la actualización de los creadores de Windows 10 (compilación 1703, abril de 2017), esto es compatible de forma nativa. Así que ahora puedes ejecutar los binarios de Windows desde Linux ...

...y viceversa:

Para obtener más información, consulte el artículo vinculado anterior.


Mientras se ejecuta un .exe desde la línea de comandos, cuando se ejecuta desde, por ejemplo, PHP a través de exec() no pude hacer que funcionara. Agregar /init , sin embargo, funciona. Este es mi archivo /usr/local/bin/convert para GraphicsMagick instalado en Windows:

#!/bin/sh /init "$(ls /mnt/c/Program*/GraphicsMagick*/gm.exe|tail -1)" convert "$@"