Aquí hay una lista de las opciones disponibles a partir de 2018-05 con un montón de actualizaciones con respecto a WSL a partir de 2020-01 junto con un poco de detalle con respecto a cada uno.
Opciones que destacan
WSL está cada vez más maduro (Microsoft abandonó la advertencia de beta hace tiempo) y es muy fácil de instalar por lo que en la mayoría de los casos es una muy buena (si no la mejor) opción. Resuelve el problema utilizando un método diferente al de la mayoría de las otras opciones. Se ejecuta exactamente el mismo código binario que se ejecutaría en un sistema Linux. Hasta 2020-01 WSL intercepta las llamadas al kernel y las traduce a llamadas al kernel de Windows (piensa en lo contrario de Wine). Esto cambiará ya que la actual beta de WSL ejecuta un kernel linux real en una VM ligera.
De todos modos, con WSL obtienes un buen shell con casi todas las cosas del CLI que esperarías encontrar en una instalación de Ubuntu y la opción de apt install
casi todo lo disponible en los repositorios. Microsoft declara oficialmente que “WSL no pretende soportar escritorios o aplicaciones GUI” sin embargo hay instrucciones no oficiales sobre cómo hacerlo. Parece que tal y como están las cosas en este momento (2020-01) los principales inconvenientes de WSL son los siguientes:
Aquí hay una vieja pero agradable comparación con cygwin (tenga en cuenta que Rich Turner es un miembro del equipo de WSL y ha publicado mucha información útil con respecto a WSL)
Cygwin proporciona lo siguiente:
- un shell bash y el terminal Mintty,
- una amplia gama de utilidades comunes de Linux compiladas para ejecutarse en Windows
- una completa capa de compatibilidad que permite ejecutar programas de Linux en Windows.
Cygwin pretende facilitar la portación de aplicaciones Linux en Windows. Si algún programa en C fue diseñado para Unix y espera utilizar características como tuberías, acceso a archivos y directorios al estilo de Unix, etc., entonces puede compilarlo para Cygwin y éste actuará como una capa de compatibilidad entre el código y el SO extranjero (Windows). Esto permite que el mismo programa en C funcione tanto en Linux como en Windows con poca o ninguna modificación. De este modo, se ha recopilado una enorme lista de programas de Linux que pueden ejecutarse al instalar Cygwin. Sin embargo, usted, el usuario de estos programas, probablemente tendrá que estar familiarizado con Unix. Por ejemplo, puede necesitar pasar argumentos como /cygdrive/c/autoexec.bat
en lugar de c:\autoexec.bat
y estar preparado para tratar con la salida con terminación de línea de Unix (\n
) en lugar de la terminación de línea de Windows (\r\n
).
La colección de todos los programas de Cygwin conforman un repositorio y aunque Cygwin no tiene un gestor de paquetes tradicional de Linux puedes añadir, eliminar y actualizar programas de este repositorio en cualquier momento con una forma muy contraintuitiva (ejecutas el setup. exe en cualquier momento después de que la instalación se haya completado)
- Babun ** es Cygwin con un gestor de paquetes completo (pact), oh-my-zsh para su shell, git, actualizaciones automáticas y una arquitectura orientada a los plugins. Aunque el shell por defecto es zsh, se puede cambiar fácilmente a bash. Parece una buena actualización de Cygwin vainilla si no te importa el peso extra.
Mingw-w64 proporciona lo siguiente:
- un shell bash,
- una buena cantidad de utilidades de Linux,
- una cadena de herramientas de desarrollo de SW para construir aplicaciones que se ejecutarán sin una capa de compatibilidad de Linux (o con una mínima).
MinGW es principalmente una distribución de software y una plataforma de construcción para Windows. En particular, es un puerto de Windows de las herramientas de compilación de GNU, como GCC, make, bash, etc. Incluye una buena cantidad de herramientas GNU y una capa mínima de compatibilidad con Unix.
La principal diferencia entre Mingw-w64 y Cygwin está en las prioridades: Cygwin tiene como objetivo proporcionar una capa de compatibilidad POSIX completa que incluya una implementación completa de todas las llamadas al sistema y bibliotecas principales de Unix; el rendimiento es secundario a la compatibilidad. MinGW tiene como objetivo el rendimiento, por lo que no proporcionará ciertas APIs POSIX que no pueden ser implementadas fácilmente y/o lo suficientemente rápido en Windows. Además, el objetivo principal de MinGW son los desarrolladores de software. Sin embargo, los usuarios casuales también pueden disfrutar de su shell y de las utilidades de propósito general incluidas.
MSYS2 proporciona lo siguiente:
- un shell bash y el terminal Mintty,
- una buena cantidad de utilidades Linux,
- un completo gestor de paquetes de línea de comandos para instalar programas del SO
- partes tanto de Cygwin como de MinGW para soportar la construcción de aplicaciones con o sin una capa de compatibilidad completa con Linux.
- un repositorio de software y un gestor de paquetes (pacman) que facilita la instalación, el uso, la construcción y la portabilidad de software en Windows.
MSYS2 también es principalmente una distribución de software y una plataforma de construcción para Windows como MinGW, pero combina tanto la forma de Cygwin como la de MinGW. Puedes usar MSYS2 para crear “programas MinGW” o “programas MSYS2”. Estos últimos se vinculan a la capa de compatibilidad de MSYS2 (msys-2.dll), que a su vez sigue de cerca el desarrollo de la capa de compatibilidad de Cygwin con algunas adiciones/modificaciones . Sin embargo, los repositorios de los dos proyectos no tienen nada que ver. Así que aunque tanto MSYS2 como Cygwin proporcionan grep.exe
pueden tener una versión completamente diferente.
- Git para Windows ** es sólo MSYS2 con git instalado o al menos fuertemente basado en MSYS2 . Proporciona el mismo shell (bash), terminal (Mintty) y gestor de paquetes (pacman). Parece ser la forma más popular de hacer funcionar el Git dominante en Windows y junto con él se obtiene un bonito entorno Unix.
Terreno común
Excepto WSL la mayoría de las herramientas anteriores comparten mucha tecnología común (bibliotecas, ejecutables, conceptos). Por ejemplo, el shell bash que viene con MinGW depende de msys-2.dll que a su vez es un fork de cygwin.dll. Así que sí, hay mucho espacio para la confusión :-)
Más opciones
Cmder ** proporciona un bonito terminal y un shell tipo bash para Windows. Su componente principal es * Conemu ** (la terminal). Además de eso, añade Clink que proporciona Powerful Bash-style command line editing, un diseño de prompt personalizado y el esquema de colores de Monokai. Es altamente (o quizás totalmente) compatible con los programas de consola nativos de Windows.
Scoop ** proporciona un gestor de paquetes de línea de comandos para muchos programas multiplataforma bien conocidos, incluyendo muchas herramientas GNU. Descarga paquetes precompilados. No proporciona ni shell ni terminal_ sino que se ejecuta bajo cmd.exe de windows (con todas sus limitaciones pero también con su total compatibilidad con los programas de consola nativos de windows). Tampoco incluye una suite de compiladores (pero por supuesto los compiladores y las herramientas de desarrollo son los típicos paquetes que se pueden instalar con scoop). Muchos de los programas que Scoop instala vienen directamente del proyecto MinGW/MSYS, o fueron construidos usando sus herramientas.
Aún más opciones
Las soluciones de abajo no parecen activas y nunca las he probado, pero parecen hacer el trabajo para otros:
Gow ** (Gnu On Windows) es la alternativa ligera a Cygwin sin shell. Utiliza un conveniente instalador de Windows que instala alrededor de 130 aplicaciones de código abierto de Linux extremadamente útiles compiladas como binarios nativos de win32 y disponibles a través de cmd.exe de Windows. Está diseñado para ser lo más pequeño posible (unos 10 MB).
UnxUtils & GnuWin32 **: UnxUtils es una colección de ports de utilidades comunes tipo GNU Unix a Win32 nativo, con ejecutables que sólo dependen del msvcrt.dll de Microsoft C-runtime. Hay que descargar la parte principal y unas cuantas actualizaciones . GnuWin32 tiene versiones posteriores a las de UnxUtils, pero requiere archivos de soporte (por ejemplo, DLLs)
MSYS & MinGW parecen haber sido obsoletos por MSYS2 & MinGW-W64 por lo que nunca los miré.
Algunos problemas comunes en Cygwin & MSYS2
Respecto al terminal
Mintty es el terminal utilizado en Cygwin, MSYS2 y sus derivados. Hay que tener en cuenta que si se ejecutan programas de consola nativos de Windows no es un sustituto indoloro del Símbolo del sistema de Windows. Mientras que los programas con salida de texto simple suelen funcionar bien, los interactivos y a pantalla completa suelen tener problemas. Lee más en la página principal de Mintty y también lee la entrada “Algunos programas de consola nativos no funcionan cuando se ejecutan desde Git Bash” en Git for Windows FAQ . Esa entrada tiene estas recomendaciones para hacer cuando te enfrentas a este tipo de problemas:
Hay varios métodos para solucionar estos problemas:
- Ejecutar los programas que tienen problemas usando la utilidad winpty . Esto le permite seguir usando la terminal mintty, pero puede ser difícil de manejar si necesita la solución para muchos programas.
- [use cmd.exe] y configúrelo para “Edición rápida”, tamaño razonable y desplazamiento hacia atrás y fuente unicode adecuada. Tendrás que seguir viviendo con las otras peculiaridades de [cmd.exe].
- Instalar y utilizar Conemu .
Otras cuestiones
Las dos cosas más importantes a tener en cuenta son estas:
Hay un compromiso entre la potencia y los problemas de depuración. Cuanto más potente sea la solución, más cosas pueden ir mal, incluso en formas que inicialmente no parecen estar relacionadas con su capa Linux.
si no tienes mucha experiencia en Linux no uses las soluciones más potentes como Cygwin/MSYS2/MinGW
UnxUtils y GnuWin32 tienen la menor potencia pero también el menor potencial de causarte dolores de cabeza. Cygwin y otros similares son los más potentes y los que más dolores de cabeza provocan. Cmder está en algún lugar en el medio. Así que cuando necesites las soluciones más potentes duerme bien y concéntrate al máximo. Evita utilizar soluciones potentes mientras pruebas algo nuevo y posiblemente inestable. Tampoco olvides que las soluciones de mediana complejidad como cmder no son impecables.
El problema de que los comandos de Linux hagan sombra a los de Windows es una causa común de problemas difíciles de depurar en soluciones como Cygwin/MSYS2/MinGW. Aquí hay un ejemplo: Tenía un archivo .bat que utilizaba el comando timeout. Cuando se ejecutaba bajo Cygwin fallaba porque timeout es también un comando de Linux pero con una sintaxis diferente. Después de detectar el problema, descubrí que podía añadir un PATH=… al principio del archivo .bat para asegurarme de que el comando de Windows tuviera prioridad. Pero entonces obtuve un error aún más críptico “Input redirection is not supported” y me conformé con una solución antes de encontrar la razón.
He aquí un ejemplo de un problema con cmder. Estaba ejecutando la versión de Windows de unison bajo Cmder y bajo algunas condiciones especiales se colgaba con absolutamente ningún mensaje de error. El mismo comando siempre se ejecutaba perfectamente bajo cmd.exe. Lo curioso es que también se ejecutaba perfectamente bajo Cygwin (de hecho si tienes nombres de archivos Unicode es mejor un terminal Cygwin que cmd.exe porque cmd.exe suele mostrar el texto Unicode malformado).
Sobre esta guía
Durante 2017-05 me harté de no entender las diferencias de las herramientas anteriores aunque usaba algunas de ellas desde hace tiempo (principalmente CygWin y cmder pero nunca con fines de desarrollo). Así que dediqué unas cuantas horas a grokear el panorama. Esta guía es el resultado de las notas que tomé. No soy un experto en la materia pero me he esforzado en encontrar toda la información relevante, leerla con ojo crítico y presentar las partes más importantes de forma clara. Por favor, comenten si algo les parece mal y haré lo posible por corregirlo.
Por último, una disculpa por algunos problemas de terminología: En este texto a veces uso el término Linux en lugar de UNIX o POSIX. Sé que no son lo mismo, pero es muy difícil diferenciarlos cuando se aborda un tema desde tan lejos. Incluso cuando no es difícil me lleva un tiempo que no tengo ;-)