Aqui está uma lista das opções disponíveis a partir de 2018-05 com muitas actualizações relativas à WSL a partir de 2020-01, juntamente com um pouco de detalhe sobre cada uma delas.
Opções que se destacam
WSL está a tornar-se cada vez mais maduro (a Microsoft abandonou o aviso beta há muito tempo) e é muito fácil de instalar, por isso na maioria dos casos é uma opção muito boa (se não a melhor). Resolve o problema usando um método diferente do que a maioria das outras opções. Executa-se exactamente o mesmo código binário que se executaria num sistema Linux. Até 2020-01 a WSL intercepta as chamadas do kernel e traduze-as para chamadas do kernel do windows (pense no oposto de Wine). Isto irá mudar desde que o actual beta da WSL corre um verdadeiro kernel de linux numa VM leve.
De qualquer modo, com WSL obtém-se uma boa concha com quase todos os produtos CLI que se espera encontrar numa instalação Ubuntu em stock e a opção de apt install
quase tudo o que está disponível nos repositórios. A Microsoft declara oficialmente que “WSL não tem como objectivo suportar desktops ou aplicações GUI” contudo existem instruções não oficiais sobre como o fazer. Parece que na situação actual (2020-01), os principais inconvenientes da WSL são os seguintes:
Aqui está uma comparação antiga mas agradável com cygwin (note que Rich Turner é um membro da equipa WSL e publicou muitas informações úteis sobre WSL)
Cygwin fornece o seguinte:
- uma shell bash e o terminal Mintty,
- uma extensa gama de utilitários comuns do Linux compilados para correr em Windows
- uma camada de compatibilidade abrangente que permite que os programas Linux corram em Windows.
Cygwin visa facilitar a portabilidade de aplicações Linux em Windows. Se algum programa em C foi concebido para Unix e espera utilizar características tais como pipes, ficheiro estilo Unix e acesso a directórios e.t.c. então pode compilá-lo para Cygwin e Cygwin actuará como camada de compatibilidade entre o código e o foreign OS (Windows). Isto permite que o mesmo programa C funcione tanto em Linux como em Windows com pouca ou nenhuma modificação. Uma enorme lista de programas Linux foi assim cumprida e pode ser executada quando se instala o Cygwin. Contudo, você, o utilizador destes programas, terá provavelmente de estar familiarizado com Unix. Por exemplo, poderá precisar de passar argumentos como /cygdrive/c/autoexec.bat
em vez de c:\autoexec.bat
e estar pronto para lidar com a saída com a terminação de linha Unix (\n
) em vez da terminação de linha Windows (\r\n
).
A colecção de todos os programas Cygwin compreende um repositório e embora o Cygwin não tenha um gestor de pacotes Linux tradicional, pode adicionar, remover e actualizar programas deste repositório em qualquer altura de uma forma muito contra-intuitiva (executa-se a configuração do Cygwin. exe em qualquer altura após a instalação ter terminado)
- Babun *** é Cygwin com um gestor de pacotes completo (pact), oh-my-zsh para a sua shell, git, actualizações automáticas e uma arquitectura orientada para plug-in. Embora a shell padrão seja zsh, pode facilmente mudar para bash. Parece ser uma boa actualização do baunilha Cygwin se não se importar com o peso extra.
Mingw-w64 fornece o seguinte:
- uma shell bash,
- uma quantidade razoável de utilitários Linux,
- uma cadeia de ferramentas de desenvolvimento SW para construir aplicações que funcionarão sem uma camada de compatibilidade Linux (ou com uma camada mínima).
MinGW é principalmente uma distribuição de software e uma plataforma de construção para Windows. Em particular é uma porta Windows das ferramentas compiladoras GNU, tais como GCC, make, bash, e assim por diante. Inclui uma quantidade razoável de ferramentas GNU e uma camada mínima de compatibilidade Unix.
A principal diferença entre Mingw-w64 e Cygwin está nas prioridades: Cygwin visa fornecer uma camada completa de compatibilidade POSIX, compreendendo uma implementação completa de todas as principais chamadas e bibliotecas de sistemas Unix; o desempenho é secundário em relação à compatibilidade. O MinGW visa o desempenho, pelo que não fornecerá certos APIs POSIX que não possam ser implementados com facilidade e/ou rapidez suficiente sob Windows. Também os principais alvos do MinGW são os programadores S/W. No entanto, os utilizadores ocasionais podem também desfrutar da sua concha e o objectivo geral inclui utilitários.
MSYS2 fornece o seguinte:
- uma shell bash e o terminal Mintty,
- uma quantidade razoável de utilitários Linux,
- um gestor de pacotes de linha de comando completo para instalar programas de SO
- partes tanto do Cygwin como do MinGW para suportar aplicações de construção, com ou sem uma camada de compatibilidade abrangente do Linux.
- um repositório de software e um gestor de pacotes (pacman) que facilita a instalação, utilização, compilação e porte de software em Windows.
MSYS2 é também principalmente uma distribuição de software e uma plataforma de construção para Windows como MinGW, mas combina tanto o caminho do Cygwin como o caminho do MinGW. Pode usar MSYS2 para criar “programas MinGW” ou “programas MSYS2”. O último link para a camada de compatibilidade do MSYS2 (msys-2.dll) que por si só segue de perto o desenvolvimento da camada de compatibilidade da Cygwin com algumas adições/modificações . Os repositórios dos 2 projectos não estão, no entanto, completamente relacionados. Assim, embora tanto o MSYS2 como o Cygwin forneçam grep.exe
eles podem ter uma versão completamente diferente.
- Git para Windows ** ou é apenas MSYS2 com git instalado ou pelo menos fortemente baseado em MSYS2 . Fornece o mesmo shell (bash), terminal (Mintty) e gestor de pacotes (pacman). Parece ser a forma mais popular de pôr o Git dominante a correr no Windows e junto com ele obtém-se um ambiente Unix agradável.
Terra comum
Excepto da WSL, a maioria das ferramentas acima referidas partilham muita tecnologia comum (bibliotecas, executáveis, conceitos). Por exemplo, a shell bash que vem com MinGW depende da msys-2.dll que por sua vez é um garfo de cygwin.dll. Portanto, sim, há muito espaço para confusão :-)
Mais opções
Cmder *** fornece apenas um bom terminal e uma shell tipo bash para Windows. O seu componente principal é * Conemu *** (o terminal). Além disso, adiciona Clink que fornece Powerful Bash-style edição de linha de comando, um layout de prompt personalizado e o esquema de cores Monokai. É altamente (ou talvez totalmente) compatível com programas de consola nativos do Windows.
Scoop ** fornece um gestor de pacotes de linha de comando para muitos programas de plataforma cruzada bem conhecidos, incluindo muitas ferramentas GNU. Descarrega pacotes pré-compilados. Não fornece nem shell nem terminal mas corre sob o cmd.exe do windows (com todas as suas limitações mas também com a sua total compatibilidade com programas de consola nativos do windows). Também não inclui nenhum pacote compilador (mas é claro que compiladores e ferramentas de desenvolvimento são pacotes típicos que pode instalar com o scoop). Muitos dos programas que o Scoop instala provêm directamente do projecto MinGW/MSYS, ou foram construídos utilizando as suas ferramentas.
Ainda mais opções
As soluções abaixo não parecem activas e eu nunca as testei, mas parecem fazer o trabalho para outros:
Gow ** (Gnu On Windows) é a alternativa mais leve ao Cygwin sem concha. Utiliza um conveniente instalador do Windows que instala cerca de 130 aplicações Linux de código aberto extremamente úteis compiladas como binários nativos win32 e disponíveis através do cmd.exe do windows. Foi concebido para ser tão pequeno quanto possível (cerca de 10 MB).
UnxUtils & GnuWin32 **: UnxUtils é uma colecção de portas de utilitários comuns do tipo GNU Unix para Win32 nativo, com executáveis apenas dependendo da msvcrt.dll do Microsoft C-runtime. Deve descarregar a parte principal e algumas actualizações . GnuWin32 tem versões posteriores à UnxUtils, mas requer ficheiros de suporte (ex. DLLs)
MSYS* & MinGW* parecem ter sido obsoleto por MSYS2 & MinGW-W64, por isso nunca olhei para eles.
Algumas questões comuns sobre Cygwin & MSYS2
Relativamente ao terminal
Mintty é o terminal utilizado em Cygwin, MSYS2 e os seus derivados. Deve-se estar ciente de que se estiver a executar programas de consola nativa do Windows não é um substituto indolor para o Windows Command Prompt. Enquanto os programas com saída de texto simples normalmente funcionam bem, os interactivos e de ecrã inteiro têm frequentemente problemas. Leia mais na página inicial do Mintty e também leia a entrada “Alguns programas de consola nativa não funcionam quando executados a partir de Git Bash” em Git for Windows FAQ . Essa entrada tem estas recomendações a fazer quando enfrenta este tipo de problemas:
Existem vários métodos para contornar estes problemas:
& > - Executar programas que têm problemas usando o utilitário winpty . Isto permite-lhe continuar a usar o terminal mintty mais agradável, mas pode tornar-se complicado se precisar de uma solução para muitos programas.
- [use cmd.exe] e configure-o para “Edição Rápida”, tamanho razoável e scroll-back e fonte unicode adequada. Ainda terá de viver com as outras peculiaridades de [cmd.exe].
- Instalar e usar Conemu .
Outras questões
As duas coisas mais importantes a ter em mente são estas:
há uma troca entre o poder e as questões difíceis de depurar. Quanto mais poderosa for a solução, mais coisas podem correr mal mesmo de formas que inicialmente parecerão não relacionadas com a sua camada Linux.
se não tiver muita experiência com Linux não utilize as soluções mais poderosas como Cygwin/MSYS2/MinGW
UnxUtils e GnuWin32 têm o menor poder mas também o menor potencial de lhe causar dores de cabeça. O Cygwin e similares irão superar a barra tanto em potência como em dores de cabeça. Cmder está algures no meio. Por isso quando precisar das soluções mais poderosas, durma bem e esteja totalmente concentrado. Evite utilizar soluções poderosas enquanto testa algo novo e possivelmente instável. Também não se esqueça que soluções de complexidade média como a cmder não são imaculadas.
A questão dos comandos de janelas de sombra do Linux é uma causa comum de problemas difíceis de depurar em soluções como Cygwin/MSYS2/MinGW. Aqui está um exemplo: Eu tinha um ficheiro .bat que estava a usar o comando timeout. Quando executado sob Cygwin, falharia porque o timeout é também um comando Linux, mas com sintaxe diferente. Depois de detectar o problema, descobri que podia adicionar um PATH=… no topo do ficheiro .bat para ter a certeza de que o comando windows tinha prioridade. Mas depois obtive um ainda mais enigmático “O redireccionamento de entrada não é suportado” erro e resolvi dar uma volta de trabalho antes de encontrar a razão.
Aqui está um exemplo de um problema com o cmder. Estava a correr a versão de unison do Windows em Cmder e sob algumas condições especiais estava pendurado com absolutamente sem mensagem de erro. O mesmo comando estava sempre a correr na perfeição em cmd.exe. O engraçado é que também estava a correr perfeitamente sob Cygwin (de facto, se tiver nomes de ficheiro Unicode um terminal Cygwin é melhor do que cmd.exe porque cmd.exe exibe frequentemente texto Unicode malformado).
Sobre este guia
Durante 2017-05 fartei-me de não compreender as diferenças das ferramentas acima mencionadas, embora tenha utilizado algumas delas desde há muito tempo (principalmente CygWin e cmder, mas nunca para fins de desenvolvimento). Por isso, passei algumas horas a tatear a paisagem. Este guia é o resultado das notas que guardei. Não sou especialista na matéria, mas esforcei-me muito para encontrar toda a informação relevante, li-a com um olhar crítico e apresentar claramente as partes mais importantes. Por favor, comente se algo parecer errado e farei o meu melhor para o corrigir.
Finalmente um pedido de desculpas por algumas questões terminológicas: Neste texto utilizo por vezes o termo Linux no lugar de UNIX ou POSIX. Sei que não são a mesma coisa, mas é muito difícil diferenciá-los ao abordar um tema de tão longa distância. Mesmo quando não é difícil, leva tempo que eu não tenho ;-)