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 decmd.exe
. -
wrun
: llame a un ejecutable win sincrónicamente conCreateProcess
y espere a morir (sin usarcmd.exe
). -
wstart
:wstart
un comando separado (asíncronamente) (con el uso decmd.exe
).
Para utilizarlos, debes:
- 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.
- se instalará un nuevo
- Use este
outbash.exe
(donde sea que lo instaló) para iniciar WSL, NOC:/Windows/System32/bash.exe
. - 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 "$@"