web-dev-qa-db-fra.com

Comment exécuter un exécutable Windows depuis WSL (Ubuntu) Bash

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 .

21
ankostis

Solution native

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.

L'alternative cbwin

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:

  1. Installez cbwin:
    • un nouveau outbash.exe sera installé dans votre système de fichiers Windows classique (quelque part dans votre %PATH%), plus 
    • les 3 commandes linux dans le système de fichiers WSL. 
  2. Utilisez ce outbash.exe (où que vous soyez installé) pour démarrer WSL, PAS C:\Windows\System32\bash.exe!
  3. Préfixez tous les exécutables win avec l’une de ces commandes, par exemple. 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.

20
ankostis

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 ...

 linux to windows

...et vice versa:

 windows to linux

Pour plus d'informations, voir l'article lié ci-dessus.

12
Andrew Mao

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 "$@"
1
chx