Hier ist eine Liste der Optionen, die ab 2018-05 verfügbar sind, mit einer Fülle von Aktualisierungen bezüglich WSL ab 2020-01, zusammen mit ein paar Details zu jeder Option.
Optionen, die hervorstechen
WSL wird immer ausgereifter (Microsoft hat die Beta-Warnung schon vor langer Zeit fallen gelassen) und ist sehr einfach zu installieren, so dass es in den meisten Fällen eine sehr gute (wenn nicht die beste) Option ist. Es löst das Problem mit einer anderen Methode als die meisten anderen Optionen. Sie führen genau denselben Binärcode aus, den Sie auch auf einem Linux-System ausführen würden. Bis 2020-01 fängt WSL Kernel-Aufrufe ab und übersetzt sie in Windows-Kernel-Aufrufe (denken Sie an das Gegenteil von Wine). Dies wird sich ändern, da die aktuelle Beta von WSL einen echten Linux-Kernel in einer leichtgewichtigen VM ausführt.
Wie auch immer, mit WSL erhalten Sie eine nette Shell mit fast allen CLI-Goodies, die Sie bei einer Ubuntu-Installation erwarten würden, und die Möglichkeit, apt install
fast alles aus den Repositories zu nutzen. Microsoft gibt offiziell an, dass “WSL nicht darauf abzielt, GUI-Desktops oder -Anwendungen zu unterstützen” allerdings gibt es inoffizielle Anleitungen, wie man es machen kann. Es scheint, dass nach dem derzeitigen Stand der Dinge (2020-01) die Hauptnachteile von WSL die folgenden sind:
Hier ist ein alter, aber netter Vergleich mit cygwin (beachten Sie, dass Rich Turner ein Mitglied des WSL-Teams ist und eine Menge nützlicher Informationen über WSL gepostet hat)
Cygwin bietet folgendes:
- eine Bash-Shell und das Mintty-Terminal,
- eine umfangreiche Palette gängiger Linux-Dienstprogramme, die für die Ausführung unter Windows kompiliert wurden,
- eine umfassende Kompatibilitätsschicht, die die Ausführung von Linux-Programmen unter Windows ermöglicht.
Cygwin zielt darauf ab, die Portierung von Linux-Anwendungen auf Windows zu vereinfachen. Wenn ein C-Programm für Unix entwickelt wurde und die Verwendung von Funktionen wie Pipes, Datei- und Verzeichniszugriff im Unix-Stil usw. erwartet, dann können Sie es für Cygwin kompilieren und Cygwin wird als Kompatibilitätsschicht zwischen dem Code und dem fremden Betriebssystem (Windows) fungieren. So kann das gleiche C-Programm mit wenigen oder gar keinen Änderungen sowohl unter Linux als auch unter Windows funktionieren. Eine riesige Liste von Linux-Programmen ist auf diese Weise zusammengestellt worden und kann ausgeführt werden, wenn Sie Cygwin installieren. Allerdings müssen Sie, der Benutzer dieser Programme, wahrscheinlich mit Unix vertraut sein. Zum Beispiel müssen Sie möglicherweise Argumente wie /cygdrive/c/autoexec.bat
statt c:\autoexec.bat
übergeben und bereit sein, mit Ausgaben mit Unix-Zeilenterminierung (\n
) statt Windows-Zeilenterminierung (\r\n
) umzugehen.
Die Sammlung aller Cygwin-Programme bilden ein Repository, und obwohl Cygwin keinen traditionellen Linux-Paketmanager hat, können Sie jederzeit Programme aus diesem Repository hinzufügen, entfernen und aktualisieren, und zwar auf eine sehr kontraintuitive Weise (Sie führen Cygwins setup. exe jederzeit nach der Installation aus)
- Babun ** ist Cygwin mit einem vollwertigen Paketmanager (pact), oh-my-zsh für seine Shell, git, automatischen Updates und einer Plugin-orientierten Architektur. Obwohl die Standard-Shell zsh ist, kann man leicht auf bash umschalten. Es scheint ein nettes Upgrade von vanilla Cygwin zu sein, wenn Sie sich nicht an dem zusätzlichen Gewicht stören.
Mingw-w64 bietet das Folgende:
- eine Bash-Shell,
- eine ganze Reihe von Linux-Utilities,
- eine SW-Entwicklungs-Toolchain, um Anwendungen zu erstellen, die ohne Linux-Kompatibilitätsschicht (oder mit einer minimalen) laufen.
MinGW ist in erster Linie eine Software-Distribution und eine Entwicklungsplattform für Windows. Insbesondere ist es eine Windows-Portierung der GNU-Compiler-Werkzeuge, wie GCC, make, bash und so weiter. Es enthält eine ganze Reihe von GNU-Werkzeugen und eine minimale Unix-Kompatibilitätsschicht.
Der Hauptunterschied zwischen Mingw-w64 und Cygwin liegt in den Prioritäten: Cygwin zielt darauf ab, eine komplette POSIX-Kompatibilitätsschicht bereitzustellen, die eine vollständige Implementierung aller wichtigen Unix-Systemaufrufe und -Bibliotheken umfasst; die Leistung ist der Kompatibilität untergeordnet. MinGW zielt auf Leistung ab, daher wird es bestimmte POSIX-APIs, die unter Windows nicht einfach und/oder schnell genug implementiert werden können, nicht bereitstellen. Außerdem ist die Hauptzielgruppe von MinGW die S/W-Entwickler. Nichtsdestotrotz werden auch Gelegenheitsanwender ihre Freude an der Shell und den mitgelieferten Dienstprogrammen für allgemeine Zwecke haben.
MSYS2 bietet Folgendes:
- eine Bash-Shell und das Mintty-Terminal,
- eine ganze Reihe von Linux-Utilities,
- einen vollwertigen Kommandozeilen-Paketmanager zum Installieren von OS-Programmen
- Teile sowohl von Cygwin als auch von MinGW, um das Erstellen von Anwendungen entweder mit oder ohne eine umfassende Linux-Kompatibilitätsschicht zu unterstützen.
- ein Software-Repository und einen Paketmanager (pacman), der es einfach macht, Software unter Windows zu installieren, zu verwenden, zu erstellen und zu portieren.
MSYS2 ist auch in erster Linie eine Software-Distribution und eine Bauplattform für Windows wie MinGW, aber es kombiniert sowohl den Weg von Cygwin als auch den Weg von MinGW. Sie können mit MSYS2 entweder “MinGW-Programme” oder “MSYS2-Programme” erstellen. Letzteres verweist auf die Kompatibilitätsschicht von MSYS2 (msys-2.dll), die ihrerseits eng an die Entwicklung der Kompatibilitätsschicht von Cygwin angelehnt ist, mit ein paar Ergänzungen/Änderungen . Die Repositories der 2 Projekte sind jedoch völlig unabhängig voneinander. Obwohl also sowohl MSYS2 als auch Cygwin grep.exe
bereitstellen, kann es sein, dass sie eine völlig andere Version haben.
- Git für Windows ** ist entweder nur MSYS2 mit installiertem Git oder zumindest stark auf MSYS2 basierend . Es bietet die gleiche Shell (bash), Terminal (Mintty) und Paketmanager (pacman). Es scheint der populärste Weg zu sein, das dominante Git unter Windows zum Laufen zu bringen und zusammen mit ihm erhalten Sie eine schöne Unix-Umgebung.
Gemeinsamkeiten
Abgesehen von WSL teilen die meisten der oben genannten Werkzeuge eine Menge gemeinsamer Technologie (Bibliotheken, ausführbare Dateien, Konzepte). Zum Beispiel hängt die Bash-Shell, die mit MinGW geliefert wird, von der msys-2.dll ab, die wiederum ein Fork der cygwin.dll ist. Also ja, es gibt viel Raum für Verwirrung :-)
Weitere Optionen
Cmder ** bietet nur ein nettes Terminal und eine bash-ähnliche Shell für Windows. Seine Hauptkomponente ist * Conemu ** (das Terminal). Darüber hinaus fügt es Clink hinzu, das Powerful Bash-style command line editing, ein eigenes Prompt-Layout und das Monokai-Farbschema bietet. Es ist hochgradig (oder vielleicht sogar vollständig) kompatibel mit nativen Windows-Konsolenprogrammen.
Scoop ** bietet einen Kommandozeilen-Paketmanager für viele bekannte plattformübergreifende Programme, einschließlich vieler GNU-Tools. Er lädt vorkompilierte Pakete herunter. Es stellt weder eine Shell noch ein Terminal zur Verfügung, sondern läuft unter Windows’ cmd.exe (mit all seinen Einschränkungen, aber auch mit seiner vollen Kompatibilität zu nativen Windows-Konsolenprogrammen). Es enthält auch keine Compiler-Suite (aber natürlich sind Compiler und Entwicklungswerkzeuge typische Pakete, die Sie mit Scoop installieren können). Viele der Programme, die Scoop installiert, stammen entweder direkt aus dem MinGW/MSYS-Projekt oder wurden mit deren Werkzeugen erstellt.
Noch mehr Optionen
Die unten aufgeführten Lösungen scheinen nicht aktiv zu sein und ich habe sie nie getestet, aber sie scheinen die Aufgabe für andere zu erfüllen:
Gow ** (Gnu On Windows) ist die leichtgewichtige Alternative zu Cygwin ohne Shell. Es verwendet ein bequemes Windows-Installationsprogramm, das etwa 130 extrem nützliche Open-Source-Linux-Anwendungen installiert, die als native Win32-Binärdateien kompiliert und über die cmd.exe von Windows verfügbar sind. Es ist so konzipiert, dass es so klein wie möglich ist (etwa 10 MB).
UnxUtils & GnuWin32 **: UnxUtils ist eine Sammlung von Portierungen gängiger GNU-Unix-ähnlicher Hilfsprogramme auf natives Win32, wobei die ausführbaren Dateien nur von der Microsoft C-Runtime msvcrt.dll abhängen. Sie müssen den Hauptteil und ein paar Updates herunterladen. GnuWin32 hat neuere Versionen als UnxUtils, benötigt aber unterstützende Dateien (z.B. DLLs)
MSYS & MinGW scheinen wurden von MSYS2 & MinGW-W64 veraltet zu sein, daher habe ich sie mir nie angesehen.
Einige allgemeine Probleme unter Cygwin & MSYS2
Bezüglich des Terminals
Mintty ist das Terminal, das in Cygwin, MSYS2 und deren Derivaten verwendet wird. Man sollte sich darüber im Klaren sein, dass es kein schmerzfreier Ersatz für die Windows-Eingabeaufforderung ist, wenn man windows-native Konsolenprogramme ausführt. Während Programme mit einfacher Textausgabe in der Regel gut funktionieren, gibt es bei interaktiven und Vollbildprogrammen oft Probleme. Lesen Sie mehr auf der Homepage von Mintty und lesen Sie auch den Eintrag “Some native console programs don’t work when run from Git Bash” auf Git for Windows FAQ . Dieser Eintrag enthält folgende Empfehlungen, wenn Sie mit dieser Art von Problemen konfrontiert werden:
Es gibt mehrere Methoden, um diese Probleme zu umgehen:
- Führen Sie Programme, die Probleme haben, mit dem Dienstprogramm winpty aus. Dies erlaubt Ihnen, das schönere mintty-Terminal weiter zu verwenden, kann aber unhandlich werden, wenn Sie den Workaround für viele Programme benötigen.
- [verwenden Sie cmd.exe] und konfigurieren Sie es für “Quick Edit”, vernünftige Größe und Zurückblättern und geeignete Unicode-Schriftart. Mit den anderen Macken von [cmd.exe] werden Sie trotzdem leben müssen.
- Installieren und benutzen Sie Conemu .
Andere Probleme
Die zwei wichtigsten Dinge, die Sie beachten sollten, sind diese:
Es gibt einen Kompromiss zwischen Leistung und schwer zu debuggenden Problemen. Je leistungsfähiger die Lösung ist, desto mehr Dinge können schief gehen, auch auf eine Art und Weise, die auf den ersten Blick nichts mit Ihrer Linux-Schicht zu tun hat.
wenn Sie nicht viel Linux-Erfahrung haben, sollten Sie nicht die mächtigeren Lösungen wie Cygwin/MSYS2/MinGW verwenden
UnxUtils und GnuWin32 haben die geringste Leistung, aber auch das geringste Potential, Ihnen Kopfschmerzen zu bereiten. Cygwin und ähnliche Programme liegen sowohl bei der Leistung als auch bei den Kopfschmerzen an der Spitze. Cmder liegt irgendwo in der Mitte. Also wenn Sie die leistungsstärksten Lösungen benötigen, schlafen Sie gut und seien Sie voll konzentriert. Vermeiden Sie die Verwendung leistungsstarker Lösungen, während Sie etwas Neues und möglicherweise Instabiles testen. Vergessen Sie auch nicht, dass Lösungen mittlerer Komplexität wie cmder nicht makellos sind.
Das Problem, dass Linux-Befehle die Windows-Befehle überschatten, ist eine häufige Ursache für schwer zu debuggende Probleme in Lösungen wie Cygwin/MSYS2/MinGW. Hier ist ein Beispiel: Ich hatte eine .bat-Datei, die den Befehl timeout verwendete. Wenn sie unter Cygwin ausgeführt wurde, schlug sie fehl, weil timeout auch ein Linux-Befehl ist, aber mit einer anderen Syntax. Nachdem ich das Problem entdeckt hatte, fand ich heraus, dass ich ein PATH=… am Anfang der .bat-Datei hinzufügen konnte, um sicherzustellen, dass der Windows-Befehl Priorität hatte. Aber dann bekam ich einen noch kryptischeren “Input redirection is not supported” Fehler und begnügte mich mit einem Workaround, bevor ich den Grund fand.
Hier ist ein Beispiel für ein Problem mit cmder. Ich habe die Windows-Version von unison unter Cmder laufen lassen und unter einigen speziellen Bedingungen blieb es mit absolut keiner Fehlermeldung hängen. Derselbe Befehl lief unter cmd.exe immer einwandfrei. Das Lustige ist, dass es auch unter Cygwin perfekt lief (tatsächlich ist bei Unicode-Dateinamen ein Cygwin-Terminal besser als cmd.exe, weil cmd.exe Unicode-Text oft fehlerhaft anzeigt).
Über diese Anleitung
Im Laufe des Jahres 2017-05 hatte ich es satt, die Unterschiede der oben genannten Tools nicht zu verstehen, obwohl ich einige von ihnen schon seit langem benutzte (hauptsächlich CygWin und cmder, aber nie für Entwicklungszwecke). Also habe ich ein paar Stunden damit verbracht, die Landschaft zu durchforsten. Diese Anleitung ist das Ergebnis der Notizen, die ich gemacht habe. Ich bin kein Experte auf diesem Gebiet, aber ich habe mich bemüht, alle relevanten Informationen zu finden, sie mit einem kritischen Auge zu lesen und die wichtigsten Teile übersichtlich darzustellen. Bitte kommentieren Sie, wenn Ihnen etwas falsch erscheint, und ich werde mein Bestes tun, um es zu korrigieren.
Abschließend noch eine Entschuldigung für einige terminologische Probleme: In diesem Text verwende ich manchmal den Begriff Linux anstelle von UNIX oder POSIX. Ich weiß, dass sie nicht dasselbe sind, aber es ist sehr schwierig, zwischen ihnen zu unterscheiden, wenn man sich einem Thema aus so großer Entfernung nähert. Selbst wenn es nicht schwierig ist, braucht es Zeit, die ich nicht habe ;-)