it-swarm.com.de

Wie kann ein Windows-Programm von WSL (Ubuntu) Bash ausgeführt werden?

Neben dem Windows 10 Anniversary-Update für Sommer 2016 bestand die Möglichkeit, ubuntu - Binärdateien im neuen Windows-Subsystem für Linux (WSL) auszuführen, einem "leichten" virtualisierten Subsystem.

Beim Starten von C:\Windows\System32\bash.exe startet eine andere bash-ELF-Binärdatei einen Prozess in der WSL, von dem aus Sie nicht entkommen können! Sie können nur andere ELF-Binärdateien starten.

Wie kann ich also *.exe-Dateien von Windows Bash ausführen? [1]

[1] Frage auch gestellt in Microsoft "offiziellem" GH Support Repo .

21
ankostis

Native Lösung

Die offizielle Lösung, die mit Windows 10 Insider Preview Update (14951) bereitgestellt wird, basiert auf der fast vergessenen binfmt_msc Linux-Einrichtung zum Starten von Binärdateien. Der Registrierungsbefehl für binfmt_misc würde folgendermaßen aussehen (wobei /init der vorläufige binfmt_misc "Interpreter" für die win-ausführbaren Dateien ist:

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

Und dann würde Win-Executable wie normale Programme gestartet:

$ 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

Nicht, dass sich eine ausführbare Win-Datei im Dateisystem Windows (DrvFs) befinden muss - nicht im Dateisystem von Linux (VolFs) -, um ein ordnungsgemäßes Windows Arbeitsverzeichnis.

Die Alternative cbwin

Bis Sie das neueste Build erhalten, bietet project cbwin eine Problemumgehung, indem Sie 3 neue Linux-Befehle in der WSL installieren:

  • wcmd: ruft eine ausführbare Win-Datei über cmd.exe auf. 
  • wrun: Ruft eine win-ausführbare Datei synchron mit CreateProcess auf und wartet, bis sie stirbt (wobei cmd.exe nicht verwendet wird). 
  • wstart: Startet einen separaten Befehl (asynchron) (mithilfe von cmd.exe).

Um sie verwenden zu können, müssen Sie:

  1. Installieren Sie cbwin:
    • ein neuer outbash.exe wird in Ihrem regulären Windows-Dateisystem (irgendwo in Ihrem %PATH%) installiert, plus 
    • die 3 Linux-Befehle im WSL-Dateisystem. 
  2. Verwenden Sie diesen outbash.exe (wo auch immer Sie ihn installiert haben), um WSL zu starten, NICHT C:\Windows\System32\bash.exe!
  3. Stellen Sie einem beliebigen ausführbaren Programm einen dieser Befehle vor, z. wrun notepad.

Tipp: Wenn die mit wcmd oder wrun gestartete ausführbare Datei alle untergeordneten Elemente hervorbringt, bleiben diese nur so lange erhalten, bis die ausführbare Datei am Leben ist. 

Mit anderen Worten, der Start von notepad.exe mit wcmd funktioniert nicht, da notepad gleich nach dem Start abgebrochen wird. Verwenden Sie in diesem Fall wrun (synchron) oder wstart (asynchron).

20
ankostis

Im Windows 10 Creators Update (Build 1703, April 2017) wird dies nativ unterstützt. So können Sie Windows-Binärdateien jetzt unter Linux ausführen ...

 linux to windows

...und umgekehrt:

 windows to linux

Weitere Informationen finden Sie im oben verlinkten Artikel.

12
Andrew Mao

Während ein .exe von der Kommandozeile aus läuft, funktioniert das nicht, wenn ich von PHP über exec() aus laufe. Das Hinzufügen von /init funktioniert jedoch. Dies ist meine /usr/local/bin/convert-Datei für GraphicsMagick, die unter Windows installiert ist:

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