Voici une liste des options disponibles à partir de 2018-05 avec de nombreuses mises à jour concernant le WSL à partir de 2020-01 ainsi qu'un peu de détails concernant chacune d'entre elles.
Options qui se démarquent
WSL est de plus en plus mature (Microsoft a abandonné le beta warning il y a longtemps) et est très facile à installer, donc dans la plupart des cas c'est une très bonne (sinon la meilleure) option. Il résout le problème en utilisant une méthode différente de la plupart des autres options. Vous exécutez exactement le même code binaire que celui que vous exécuteriez sur un système Linux. Jusqu'en 2020-01, le WSL intercepte les appels du noyau et les traduit en appels du noyau Windows (pensez à l'inverse de Wine). Cela va changer puisque la version bêta actuelle du WSL fait tourner un vrai noyau linux dans une VM légère.
Quoi qu'il en soit, avec le WSL, vous obtenez un joli shell avec presque tous les goodies CLI que vous vous attendez à trouver sur une installation Ubuntu de série et l'option à apt install
presque tout ce qui est disponible dans les dépôts. Microsoft déclare officiellement que “WSL n'a pas pour but de prendre en charge les ordinateurs de bureau ou les applications à interface graphique” cependant, il existe des instructions non officielles sur la manière de le faire. Il semble que dans l'état actuel des choses (2020-01), les principaux inconvénients du WSL sont les suivants :
Voici une vieille mais belle comparaison avec cygwin (notez que Rich Turner est un membre de l'équipe WSL et qu'il a posté de nombreuses informations utiles concernant le WSL)
Cygwin fournit ce qui suit :
- un shell bash et le terminal Mintty,
- une vaste gamme d'utilitaires Linux courants compilés pour fonctionner sous Windows
- une couche de compatibilité complète qui permet aux programmes Linux de fonctionner sous Windows.
Cygwin vise à faciliter le portage des applications Linux sur Windows. Si un programme en C a été conçu pour Unix et prévoit d'utiliser des fonctionnalités telles que les tuyaux, l'accès aux fichiers et aux répertoires de style Unix e.t.c., alors vous pouvez le compiler pour Cygwin et Cygwin agira comme une couche de compatibilité entre le code et le système d'exploitation foreign (Windows). Cela permet au même programme C de fonctionner à la fois sous Linux et Windows avec peu ou pas de modifications. Une énorme liste de programmes Linux a ainsi été respectée et peut être exécutée lorsque vous installez Cygwin. Cependant, vous, l'utilisateur de ces programmes, devra probablement être familier avec Unix. Par exemple, vous devrez peut-être passer des arguments comme /cygdrive/c/autoexec.bat
au lieu de c:\autoexec.bat
et être prêt à traiter la sortie avec une terminaison de ligne Unix (\n
) au lieu d'une terminaison de ligne Windows (\r\n
).
La collection de tous les programmes Cygwin comprend un dépôt et bien que Cygwin ne dispose pas d'un gestionnaire de paquets Linux traditionnel, vous pouvez ajouter, supprimer et mettre à jour des programmes de ce dépôt à tout moment d'une manière très contre-intuitive (vous exécutez le setup de Cygwin. exe à tout moment après que l'installation soit terminée)
- Babun ** c'est Cygwin avec un gestionnaire de paquets complet (pact), oh-my-zsh pour son shell, git, les mises à jour automatiques et une architecture orientée plug-in. Bien que le shell par défaut soit zsh, vous pouvez facilement passer à bash. Il semble que ce soit une belle mise à jour de Cygwin vanille si vous n'êtes pas gêné par le poids supplémentaire.
Mingw-w64 fournit ce qui suit :
- un shell bash,
- une bonne quantité d'utilitaires Linux,
- une chaîne d'outils de développement SW pour construire des applications qui fonctionneront sans couche de compatibilité Linux (ou avec une couche minimale).
MinGW est principalement une distribution de logiciels et une plate-forme de construction pour Windows. C'est notamment un portage Windows des outils du compilateur GNU, tels que GCC, make, bash, etc. Il comprend une bonne quantité d'outils GNU et une couche de compatibilité Unix minimale.
La principale différence entre Mingw-w64 et Cygwin réside dans les priorités : Cygwin vise à fournir une couche de compatibilité POSIX complète comprenant une implémentation complète de tous les principaux appels système et bibliothèques Unix ; la performance est secondaire à la compatibilité. MinGW vise la performance, de sorte qu'il ne fournira pas certaines API POSIX qui ne peuvent pas être mises en œuvre facilement et/ou assez rapidement sous Windows. Les développeurs S/W sont également la cible principale de MinGW. Néanmoins, les utilisateurs occasionnels peuvent également apprécier son shell et les utilitaires généraux inclus.
MSYS2 fournit ce qui suit :
- un shell bash et le terminal Mintty,
- une quantité importante d'utilitaires Linux,
- un gestionnaire de paquets en ligne de commande complet pour installer les programmes du système d'exploitation
- des parties de Cygwin et MinGW pour prendre en charge la création d'applications avec ou sans couche de compatibilité Linux complète.
- un dépôt de logiciels et un gestionnaire de paquets (pacman) qui facilite l'installation, l'utilisation, la construction et le portage de logiciels sous Windows.
MSYS2 est également principalement une distribution de logiciels et une plate-forme de construction pour Windows comme MinGW, mais elle combine à la fois la manière de Cygwin et la manière de MinGW. Vous pouvez utiliser MSYS2 pour créer soit “programmes MinGW” soit “programmes MSYS2”. Ce dernier lien vers la couche de compatibilité de MSYS2 (msys-2.dll) qui suit elle-même de près le développement de la couche de compatibilité de Cygwin avec quelques ajouts/modifications . Les dépôts des 2 projets ne sont cependant pas du tout liés. Ainsi, bien que MSYS2 et Cygwin fournissent tous deux grep.exe
ils peuvent avoir une version complètement différente.
- Git pour Windows ** est soit juste MSYS2 avec git installé, soit au moins fortement basé sur MSYS2 . Il fournit le même shell (bash), terminal (Mintty) et gestionnaire de paquets (pacman). Il semble que ce soit le moyen le plus populaire de faire fonctionner le Git dominant sous Windows et, avec lui, vous obtenez un environnement Unix agréable.
Terrain d'entente
Sauf pour le WSL, la plupart des outils ci-dessus partagent beaucoup de technologies communes (bibliothèques, exécutables, concepts). Par exemple, le shell bash fourni avec MinGW dépend de msys-2.dll qui est lui-même un fork de cygwin.dll. Donc oui, il y a beaucoup de place pour la confusion :-)
Plus d'options
Cmder ** fournit juste un joli terminal et un shell de type bash pour Windows. Son composant principal est * Conemu ** (le terminal). En plus de cela, il ajoute Clink qui fournit une puissante édition en ligne de commande de style bash, une mise en page personnalisée de l'invite et le schéma de couleurs Monokai. Il est hautement (ou peut-être entièrement) compatible avec les programmes natifs de la console Windows.
Scoop ** fournit un gestionnaire de paquets en ligne de commande pour de nombreux programmes multiplateformes bien connus, y compris de nombreux outils GNU. Il permet de télécharger des paquets pré-compilés. Il ne fournit ni shell ni terminal mais fonctionne sous cmd.exe de Windows (avec toutes ses limitations mais aussi avec sa compatibilité totale avec les programmes natifs de la console Windows). Il ne comprend pas non plus de suite de compilateurs (mais bien sûr, les compilateurs et les outils de développement sont des paquets typiques que vous pouvez installer avec scoop). Beaucoup de programmes installés par Scoop proviennent directement du projet MinGW/MSYS ou ont été construits avec leurs outils.
Encore plus d'options
Les solutions ci-dessous ne semblent pas actives et je ne les ai jamais testées mais elles semblent faire le travail pour les autres :
Gow ** (Gnu On Windows) est l'alternative légère à Cygwin sans shell. Il utilise un installateur Windows pratique qui installe environ 130 applications Linux à source ouverte extrêmement utiles, compilées sous forme de binaires win32 natifs et disponibles via le fichier cmd.exe de Windows. Il est conçu pour être aussi petit que possible (environ 10 Mo).
UnxUtils & GnuWin32 ** : UnxUtils est un ensemble de portages d'utilitaires courants de type GNU Unix sur Win32 natif, dont les exécutables dépendent uniquement du fichier msvcrt.dll de Microsoft C-runtime. Vous devez télécharger la partie principale et quelques mises à jour . GnuWin32 a des versions plus récentes que UnxUtils, mais nécessite des fichiers de support (par exemple des DLL)
MSYS & MinGW semblent avoir été obsolètes par MSYS2 & MinGW-W64 donc je ne les ai jamais regardés.
Quelques problèmes communs sur Cygwin & MSYS2
Concernant le terminal
Mintty est le terminal utilisé dans Cygwin, MSYS2 et leurs dérivés. Il faut savoir que si vous exécutez des programmes de console natifs de Windows, il ne remplace pas sans peine l'invite de commande de Windows. Alors que les programmes avec une simple sortie texte fonctionnent généralement bien, les programmes interactifs et plein écran ont souvent des problèmes. Lisez more on Mintty’s home page et lisez également l'entrée “Some native console programs don’t work when run from Git Bash” sur Git for Windows FAQ . Cette entrée contient les recommandations suivantes lorsque vous êtes confronté à ce genre de problèmes :
Il existe plusieurs méthodes pour contourner ces problèmes :
- Exécuter les programmes qui ont des problèmes en utilisant l'utilitaire winpty . Cela vous permet de continuer à utiliser le terminal mintty, plus agréable, mais peut devenir difficile à utiliser si vous avez besoin d'une solution de contournement pour de nombreux programmes.
- [utilisez cmd.exe] et configurez-le pour “Quick Edit”, une taille et un défilement raisonnables et une police de caractères unicode adaptée. Vous devrez quand même vivre avec les autres bizarreries de [cmd.exe].
- Installez et utilisez Conemu .
Autres problèmes
Les deux choses les plus importantes à garder à l'esprit sont les suivantes :
il y a un échange entre le pouvoir et les problèmes difficiles à déboguer. Plus la solution est puissante, plus les choses peuvent mal tourner, même d'une manière qui, au départ, semblera sans rapport avec votre couche Linux.
Si vous n'avez pas beaucoup d'expérience de Linux, n'utilisez pas les solutions les plus puissantes comme Cygwin/MSYS2/MinGW
UnxUtils et GnuWin32 sont les moins puissantes mais aussi les moins susceptibles de vous causer des maux de tête. Cygwin et les autres solutions similaires sont les plus puissantes et les plus efficaces pour les maux de tête. Cmder se situe quelque part au milieu. Donc lorsque vous avez besoin des solutions les plus puissantes, dormez bien et soyez pleinement concentré. Évitez d'utiliser des solutions puissantes pendant que vous testez quelque chose de nouveau et éventuellement instable. N'oubliez pas non plus que les solutions de complexité moyenne comme le cmder ne sont pas sans tache.
Le problème des commandes Linux qui masquent celles des fenêtres est une cause fréquente de problèmes difficiles à déboguer dans des solutions comme Cygwin/MSYS2/MinGW. En voici un exemple : J'avais un fichier .bat qui utilisait la commande timeout. Lorsqu'il était exécuté sous Cygwin, il échouait car la commande timeout est également une commande Linux mais avec une syntaxe différente. Après avoir repéré le problème, j'ai découvert que je pouvais ajouter un PATH=… en haut du fichier .bat pour m'assurer que la commande Windows avait la priorité. Mais ensuite, j'ai eu une erreur “Input redirection is not supported” encore plus cryptique et je me suis contenté d'une solution de contournement avant d'en trouver la raison.
Voici un exemple de problème avec cmder. Je faisais tourner la version Windows de Unison sous Cmder et dans certaines conditions spéciales, elle fonctionnait avec absolument aucun message d'erreur. La même commande fonctionnait toujours parfaitement sous cmd.exe. Ce qui est amusant, c'est qu'elle fonctionnait aussi parfaitement sous Cygwin (en fait, si vous avez des noms de fichiers Unicode, un terminal Cygwin est mieux que cmd.exe car cmd.exe affiche souvent un texte Unicode malformé).
A propos de ce guide
Au cours de l'année 2017-05, j'en ai eu assez de ne pas comprendre les différences entre les outils ci-dessus, bien que j'en utilise certains depuis longtemps (principalement CygWin et cmder, mais jamais à des fins de développement). J'ai donc passé quelques heures à tâter le terrain. Ce guide est le résultat des notes que j'ai gardées. Je ne suis pas un expert en la matière, mais j'ai fait de mon mieux pour trouver toutes les informations pertinentes, les lire d'un œil critique et présenter clairement les parties les plus importantes. Veuillez me faire part de vos commentaires si quelque chose vous semble incorrect et je ferai de mon mieux pour le corriger.
Enfin des excuses pour certains problèmes de terminologie : Dans ce texte, j'utilise parfois le terme Linux au lieu d'UNIX ou POSIX. Je sais que ce ne sont pas les mêmes, mais il est très difficile de les différencier lorsqu'on aborde un sujet à une si grande distance. Même quand ce n'est pas difficile, cela prend du temps que je n'ai pas ;-)