La mise à jour Windows 10 Anniversary pour l'été 2016 offre la possibilité d'exécuter des binaires ubuntu dans le nouveau sous-système Windows pour Linux (WSL) , un sous-système virtualisé "léger".
Malheureusement, en lançant C:\Windows\System32\bash.exe
, un autre binaire ELV bash
démarre un processus dans le WSL, à partir duquel vous ne pouvez pas vous échapper! Vous ne pouvez lancer que d'autres binaires ELF.
Alors, comment puis-je exécuter des fichiers *.exe
à partir de Windows Bash? [1]
[1] Question posée également dans le référentiel "officiel" de support GH de Microsoft .
La solution officielle fournie avec mise à jour de Windows 10 Insider Preview Update (14951) est basée sur la fonctionnalité presque oubliée binfmt_msc Linux permettant de lancer des fichiers binaires. La commande d'enregistrement pour le binfmt_misc serait comme ceci (où /init
est le provisoire binfmt_misc "interprète" pour les exécutables win):
Sudo echo ":WSLInterop:M::MZ::/init:" > /proc/sys/fs/binfmt_misc/register
Et puis win-exécutable serait lancé comme un programme normal:
$ 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
Tous les exécutables win ne doivent pas résider dans les fenêtres (DrvFs) système de fichiers - pas sur le système de fichiers de Linux (VolFs) - pour pouvoir hériter d'un Windows répertoire de travail.
Jusqu'à ce que vous obteniez la dernière version, le projet cbwin offre une solution de contournement en installant 3 nouvelles commandes linux dans WSL:
wcmd
: appelle un win-exécutable via cmd.exe
. wrun
: appelle un Win-exécutable de manière synchrone avec CreateProcess
et attend de mourir (n'utilise pas cmd.exe
). wstart
: lance une commande détachée (asynchrone) (avec l'utilisation de cmd.exe
).Pour les utiliser, vous devez:
outbash.exe
sera installé dans votre système de fichiers Windows classique (quelque part dans votre %PATH%
), plus outbash.exe
(où que vous soyez installé) pour démarrer WSL, PAS C:\Windows\System32\bash.exe
!wrun notepad
.Astuce: Si l'exécutable lancé avec wcmd
ou wrun
génère des enfants, ceux-ci ne survivent que tant que l'exécutable reste en vie.
En d'autres termes, essayer de démarrer notepad.exe
avec wcmd
ne fonctionnera pas, car bloc-notes sera tué juste après avoir été lancé - Utilisez wrun
(synchrone) ou wstart
(asynchrone) dans ce cas.
Dans le Windows 10 Creators Update (build 1703, avril 2017), cette option est prise en charge en mode natif. Donc, vous pouvez maintenant exécuter des binaires Windows à partir de Linux ...
...et vice versa:
Pour plus d'informations, voir l'article lié ci-dessus.
Si l'exécution de .exe
à partir de la ligne de commande fonctionne, lors de l'exécution de say PHP via exec()
, je ne pouvais pas le faire fonctionner. Ajouter /init
, cependant, fonctionne. Voici mon fichier de travail /usr/local/bin/convert
pour GraphicsMagick installé sous Windows:
#!/bin/sh
/init "$(ls /mnt/c/Program*/GraphicsMagick*/gm.exe|tail -1)" convert "$@"