Hier is een lijst van de beschikbare opties vanaf 2018-05 met een groot aantal updates betreffende WSL vanaf 2020-01, samen met een beetje detail over elk van hen.
Opties die eruit springen
WSL wordt steeds volwassener (Microsoft heeft de beta waarschuwing al lang geleden laten vallen) en is erg makkelijk te installeren dus in de meeste gevallen is het een erg goede (zo niet de beste) optie. Het lost het probleem op met een andere methode dan de meeste andere opties. Je draait exact dezelfde binaire code die je op een Linux systeem zou draaien. Tot 2020-01 onderschept WSL kernel calls en vertaalt ze naar windows kernel calls (denk het tegenovergestelde van Wine). Dit zal veranderen aangezien de huidige beta van WSL een echte Linux kernel draait in een lichtgewicht VM. Hoe dan ook, met WSL krijg je een mooie shell met bijna alle CLI goodies die je zou verwachten te vinden op een standaard Ubuntu installatie en de optie om apt install
bijna alles wat beschikbaar is uit de repositories te gebruiken. Microsoft stelt officieel dat [ “WSL does not aim to support GUI desktops or applications” ]/cygdrive/c/autoexec.bat
maar er zijn onofficiële instructies over hoe je dat moet doen. Het lijkt erop dat zoals de zaken er nu voor staan (2020-01) de belangrijkste nadelen van WSL de volgende zijn:
Hier is een oude maar leuke vergelijking met cygwin (merk op dat Rich Turner lid is van het WSL team en hij heeft veel nuttige info over WSL gepost)
Cygwin biedt het volgende:
- een bash-shell en de Mintty-terminal,
- een uitgebreide reeks veelgebruikte Linux-hulpprogramma’s, gecompileerd om op Windows te draaien
- een uitgebreide compatibiliteitslaag waarmee Linux-programma’s op Windows kunnen draaien.
Cygwin is bedoeld om het porten van Linux applicaties naar Windows gemakkelijk te maken. Als een C-programma is ontworpen voor Unix en functies verwacht te gebruiken als pipes, Unix-stijl bestand- en directorytoegang, enzovoort, dan kun je het compileren voor Cygwin en Cygwin zal fungeren als een compatibiliteitslaag tussen de code en het vreemde OS (Windows). Hierdoor kan hetzelfde C programma zowel op Linux als op Windows werken met weinig of geen aanpassingen. Een enorme lijst van Linux programma’s is aldus samengesteld en kan worden uitgevoerd wanneer u Cygwin installeert. U, de gebruiker van deze programma’s, zult echter waarschijnlijk bekend moeten zijn met Unix. U zult bijvoorbeeld argumenten als c:\autoexec.bat
moeten doorgeven in plaats van \n
en klaar moeten zijn om om te gaan met uitvoer met Unix regeleinde (\r\n
) in plaats van Windows regeleinde (grep.exe
).
De verzameling van alle Cygwin programma’s vormen een repository en hoewel Cygwin geen traditionele Linux package manager heeft, kunt u op ieder moment programma’s uit deze repository toevoegen, verwijderen en updaten op een zeer contra-intuïtieve manier (u voert Cygwin’s setup. exe op elk gewenst moment na de installatie is voltooid)
- Babun ** is Cygwin met een volledig uitgeruste pakketbeheerder (pact), oh-my-zsh voor zijn shell, git, automatische updates en een plug-in georiënteerde architectuur. Hoewel de standaard shell zsh is, kun je gemakkelijk overschakelen naar bash. Het lijkt een aardige upgrade van vanilla Cygwin als je het extra gewicht niet erg vindt.
Mingw-w64 biedt het volgende:
- een bash shell,
- een behoorlijke hoeveelheid Linux utilities,
- een SW ontwikkel toolchain om apps te bouwen die zonder Linux compatibiliteitslaag draaien (of met een minimale).
MinGW is in de eerste plaats een software distributie en een bouwplatform voor Windows. In het bijzonder is het een Windows port van de GNU compiler gereedschappen, zoals GCC, make, bash, enzovoort. Het bevat een redelijke hoeveelheid GNU-gereedschappen en een minimale Unix-compatibiliteitslaag.
Het belangrijkste verschil tussen Mingw-w64 en Cygwin zit hem in de prioriteiten: Cygwin wil een volledige POSIX-compatibiliteitslaag leveren, bestaande uit een volledige implementatie van alle belangrijke Unix systeemaanroepen en bibliotheken; prestatie is ondergeschikt aan compatibiliteit. MinGW is gericht op prestaties en zal daarom bepaalde POSIX API’s niet aanbieden die niet eenvoudig en/of snel genoeg onder Windows geïmplementeerd kunnen worden. Ook is MinGW’s hoofddoel S/W ontwikkelaars. Niettemin kunnen ook gewone gebruikers plezier beleven aan de shell en de meegeleverde hulpprogramma’s voor algemene doeleinden.
MSYS2 biedt het volgende:
- een bash shell en de Mintty terminal,
- een behoorlijke hoeveelheid Linux utilities,
- een volledig uitgeruste command line package manager om OS programma’s te installeren
- onderdelen van zowel Cygwin als MinGW om het bouwen van applicaties te ondersteunen, met of zonder een uitgebreide Linux compatibiliteitslaag.
- een software repository en een package manager (pacman) die het makkelijk maakt om software onder Windows te installeren, gebruiken, bouwen en porten.
MSYS2 is ook in de eerste plaats een software distributie en een bouwplatform voor Windows zoals MinGW, maar het combineert zowel de manier van Cygwin als de manier van MinGW. Je kunt MSYS2 gebruiken om “MinGW programma’s” of “MSYS2 programma’s” te maken. Deze laatste zijn gekoppeld aan de compatibiliteitslaag van MSYS2 (msys-2.dll) die op zijn beurt de ontwikkeling van de compatibiliteitslaag van Cygwin volgt met een paar toevoegingen/wijzigingen . De repositories van de 2 projecten zijn echter totaal niet aan elkaar gerelateerd. Dus hoewel zowel MSYS2 als Cygwin 0x6& leveren, kunnen ze een compleet andere versie hebben.
- Git voor Windows ** is ofwel gewoon MSYS2 met git geïnstalleerd of op zijn minst zwaar gebaseerd op MSYS2 . Het biedt dezelfde shell (bash), terminal (Mintty) en pakketbeheerder (pacman). Het lijkt de meest populaire manier te zijn om het dominante Git draaiende te krijgen op Windows en samen met het krijg je een mooie Unix omgeving.
Gemeenschappelijke grond
Behalve WSL delen de meeste van de bovenstaande tools veel gemeenschappelijke technologie (bibliotheken, uitvoerbare bestanden, concepten). Bijvoorbeeld de bash shell die bij MinGW zit hangt af van msys-2.dll die zelf weer een fork is van cygwin.dll. Dus ja, er is genoeg ruimte voor verwarring :-)
Meer opties
Cmder ** biedt gewoon een mooie terminal en een bash-achtige shell voor Windows. Het belangrijkste onderdeel is * Conemu ** (de terminal). Daarbovenop voegt het Clink toe dat Powerful Bash-style command line editing biedt, een aangepaste prompt layout en het Monokai kleurenschema. Het is zeer (of misschien wel volledig) compatibel met native Windows console programma’s.
Scoop ** biedt een command line package manager voor veel bekende cross-platform programma’s, waaronder veel GNU tools. Het downloadt voor-gecompileerde pakketten. Het biedt geen shell of terminal, maar draait in plaats daarvan onder Windows’ cmd.exe (met al zijn beperkingen, maar ook met volledige compatibiliteit met Windows consoleprogramma’s). Het bevat ook geen compiler suite (maar natuurlijk zijn compilers en ontwikkelgereedschappen typische pakketten die je met scoop kunt installeren). Veel van de programma’s die Scoop installeert komen direct van het MinGW/MSYS project, of zijn gebouwd met hun gereedschappen.
Nog meer opties
De oplossingen hieronder lijken niet actief en ik heb ze nooit getest, maar ze lijken de klus te klaren voor anderen:
Gow ** (Gnu On Windows) is het lichtgewicht alternatief voor Cygwin zonder shell. Het gebruikt een handig Windows installatieprogramma dat ongeveer 130 uiterst nuttige open source Linux toepassingen installeert, gecompileerd als native win32 binaries en beschikbaar via windows’ cmd.exe. Het is ontworpen om zo klein mogelijk te zijn (ongeveer 10 MB).
UnxUtils & GnuWin32 **: UnxUtils is een verzameling ports van algemene GNU Unix-achtige hulpprogramma’s naar native Win32, met uitvoerbare bestanden die alleen afhankelijk zijn van de Microsoft C-runtime msvcrt.dll. U moet het hoofddeel en een paar updates downloaden. GnuWin32 heeft latere versies dan UnxUtils, maar vereist ondersteunende bestanden (b.v. DLL’s)
MSYS & MinGW lijken te zijn verouderd ](https://stackoverflow.com/questions/25019057/how-are-msys-msys2-and-msysgit-related-to-each-other) door MSYS2 & MinGW-W64, dus ik heb er nooit naar gekeken.
Enkele veel voorkomende problemen op Cygwin & MSYS2
Wat betreft de terminal
Mintty is de terminal die gebruikt wordt in Cygwin, MSYS2 en hun derivaten. Men moet zich ervan bewust zijn dat als u windows native consoleprogramma’s draait, het geen pijnloze vervanging is voor de Windows Opdrachtprompt. Terwijl programma’s met eenvoudige tekstuitvoer meestal prima werken, hebben interactieve en schermvullende programma’s vaak problemen. Lees meer op Mintty’s homepage en lees ook het item “Sommige native console programma’s werken niet als je ze uitvoert vanuit Git Bash” op Git voor Windows FAQ . Dat item heeft deze aanbevelingen voor als je met dit soort problemen te maken krijgt:
Er zijn verschillende methodes om deze problemen te omzeilen:
- Draai programma’s die problemen hebben met het winpty hulpprogramma. Dit stelt u in staat om de mooiere mintty terminal te blijven gebruiken, maar kan onhandelbaar worden als u de workaround voor veel programma’s nodig hebt.
- [gebruik cmd.exe] en configureer het voor “Snel Bewerken”, redelijke grootte en scroll-back en geschikt unicode font. Je zult nog steeds moeten leven met de andere eigenaardigheden van [cmd.exe].
- Installeer en gebruik Conemu .
Andere problemen
De twee belangrijkste dingen om in gedachten te houden zijn deze:
Er is een wisselwerking tussen kracht en moeilijk te debuggen problemen. Hoe krachtiger de oplossing, hoe meer er mis kan gaan, zelfs op manieren die in eerste instantie niets met je Linux-laag te maken lijken te hebben.
Als je niet veel Linux ervaring hebt, gebruik dan niet de krachtigere oplossingen zoals Cygwin/MSYS2/MinGW
UnxUtils en GnuWin32 hebben de minste kracht maar ook de minste mogelijkheid om je hoofdpijn te bezorgen. Cygwin en gelijksoortige programma’s staan bovenaan in zowel kracht als hoofdpijn. Cmder zit ergens in het midden. Dus wanneer u de krachtigste oplossingen nodig hebt, neem dan een goede nachtrust en wees volledig geconcentreerd. Vermijd het gebruik van krachtige oplossingen tijdens het testen van iets nieuws en mogelijk instabiel. Vergeet ook niet dat medium-complexe oplossingen zoals cmder niet vlekkeloos zijn.
Het probleem van Linux commando’s die Windows commando’s overschaduwen is een veel voorkomende oorzaak van moeilijk te debuggen problemen in oplossingen zoals Cygwin/MSYS2/MinGW. Hier is een voorbeeld: Ik had een .bat bestand dat het timeout commando gebruikte. Wanneer het onder Cygwin werd uitgevoerd, zou het mislukken omdat timeout ook een Linux commando is, maar met een andere syntaxis. Nadat ik het probleem had gevonden, ontdekte ik dat ik een PATH=… kon toevoegen bovenaan het .bat bestand om er zeker van te zijn dat het Windows commando voorrang had. Maar toen kreeg ik een nog cryptischer “Input redirection is not supported” foutmelding en nam genoegen met een workaround voordat ik de reden had gevonden.
Hier is een voorbeeld van een probleem met cmder. Ik was de Windows versie van unison aan het draaien onder Cmder en onder sommige speciale omstandigheden bleef het hangen met absoluut geen foutmelding. Hetzelfde commando draaide altijd perfect onder cmd.exe. Het grappige is dat het ook perfect werkte onder Cygwin (in feite, als je Unicode bestandsnamen hebt, is een Cygwin terminal beter dan cmd.exe omdat cmd.exe vaak Unicode tekst misvormd weergeeft).
Over deze gids
In de loop van 2017-05 werd ik ziek van het niet begrijpen van de verschillen tussen de bovenstaande tools, hoewel ik sommige van hen al sinds lang geleden gebruikte (voornamelijk CygWin en cmder, maar nooit voor ontwikkelingsdoeleinden). Dus spendeerde ik een paar uur om het landschap te doorgronden. Deze gids is het resultaat van de notities die ik bijhield. Ik ben geen expert op dit gebied, maar ik heb mijn best gedaan om alle relevante informatie te vinden, het met een kritisch oog te lezen en de belangrijkste delen duidelijk te presenteren. Geef commentaar als er iets fout lijkt te zijn en ik zal mijn best doen om het te corrigeren.
Tot slot een verontschuldiging voor enkele terminologische kwesties: In deze tekst gebruik ik soms de term Linux in plaats van UNIX of POSIX. Ik weet dat ze niet hetzelfde zijn, maar het is erg moeilijk om ze van elkaar te onderscheiden als je een onderwerp van zo'n grote afstand benadert. Zelfs als het niet moeilijk is, kost het tijd die ik niet heb ;-)