Sim, pessoal, chegou o dia. Temos PowerShell no Linux. Era algo esperado, já havia sido anunciado que teríamos uma versão do PowerShell rodando sobre .NET Core, e imaginar que ele funcionaria no Linux e no Mac era algo totalmente viável. Hoje o PowerShell multiplataforma foi anunciado, e, ainda melhor, open source, com uma licença super permissiva, a MIT.

E, caso você tenha um Mac, roda lá também.

O anúncion foi feito num vídeo muito interessante no Channel9, vale a pena assistir.

Rodando PowerShell no Docker

Testei e funcionou perfeitamente. Ele ainda está em Alpha, mas não encontrei nenhum grande problema. Testei com Docker, lógico, e já preparei uma imagem para você experimentar sem ter dores de cabeça. Ela está no Docker Hub como lambda3/powershell. Pra subir um contêiner com PowerShell no Linux, basta executar:

docker run -ti lambda3/powershell

Você vai cair direto no PowerShell interativo.

Você também pode executar esse contêiner como um executável, assim:

docker run --rm lambda3/powershell 'Get-ChildItem | where { $_.Name.Length -gt 3 }'

Isso vai executar o comando “Get-ChildItem” e exibir apenas os itens que tem mais de 3 letras no nome, e então sair. Abaixo vocês podem ver a execução acontecendo (clique para ampliar):

Resultado do docker run com PowerShell

O que isso significa

PowerShell sempre foi um shell muito legal, e evoluiu muito ao longo dos anos. Uma das coisas mais interessantes, e que eu gosto muito nele, é que os encadeamentos de comandos – os pipes – passam objetos, não strings, entre os comandos. Isso permite uma extensibilidade incrível no shell, e em scripts. E com o mundo todo falando JSON e XML hoje em dia, somado ao fato de que o PowerShell interpreta nativamente esses formatos, qualquer API ou ferramenta chamada pelo PowerShell pode ser tipada, e se utilizar dessas passagem de objetos entre os comandos.

Eu gosto muito do Bash, é um shell muito legal. No entando, escrever scripts com Bash é sempre um desafio. O PowerShell é infinitamente superior, enquanto linguagem. Vejo aí um potencial interessantíssimo, mesmo para quem preferir ficar no Bash o tempo todo (eu provavelmente continuarei lá quando estiver no Linux, pelo menos por enquanto). Mas poder escrever scripts que se conectam de maneira tão íntima com o sistema operacional, e ainda ter uma linguagem poderosa, é algo muito desejável. Sim, podemos escrever scripts com Node, e até com C#! Mas essas plataformas tem dificuldade de interagir com os comandos do shell, e com outros executáveis. Cada vez que precisamos fazer isso, lá vamos nós ter que configurar e iniciar um processo, verificar exit codes manualmente, etc. Bash resolve isso, mas é uma linguagem desafiadora (pra ser crítico e educado ao mesmo tempo). PowerShell eleva o poder que temos em mãos, não à toa tem esse nome.

Além disso, podemos escrever scripts em PowerShell que vão rodar no Linux, no Windows e no Mac, e isso também é importante. Mas já podíamos fazer isso antes com Bash, que roda no Windows. Mas, mais uma vez: uma linguagem desafiadora. Agora temos uma linguagem de shell poderosa, e multiplataforma.

Os problemas que encontrei

Foi pouco tempo, o lançamento foi hoje. Tive somente 2 pontos de incômodo:

O primeiro foi que o PowerShell é case insensitive, e a maioria dos sistemas de arquivo no Linux é case sensitive. Assim, se você tentar copiar um arquivo pra outro diretório com mesmo nome mas case diferente, ele falha. Abri um issue no Github pra acompanhar.

Bug por case insensitivity

O outro problema foi que o PowerShell exige a extensão “.ps1” nos seus scripts, e não é comum isso ser exibido no Linux. O problema maior é que isso coloca um impecilho pra rodar scripts como executáveis, com o famoso “shebang”, ou “hashbang” (entenda). O script tem que terminar com .ps1, você não pode criar um script sem extensão e simplesmente rodá-lo com “./script”, por exemplo. Já há um issue no Github cuidando disso, vai lá e coloca um thumbs up nele. Veja ele sendo reproduzido:

Problema da extensão ps1 no PowerShell

Ainda assim, no final eu executei o script sem a extensão, mas isso não funcionaria no Bash, olha só:

Executando o script PowerShell no Bash

problemas conhecidos, vale a pena dar uma olhada pra entender a estabilidade dele nesse momento. E lembre-se: ainda é alpha.

Conclusões

Imagino que teremos pelo menos seis meses até o PowerShell estar estável no Linux e no Mac. Depois disso, acho difícil que ele seja adotado pela maioria como um ambiente de shell no Linux, mas acho que há uma grande possibilidade de adoção enquanto linguagem de scripting. Pelo menos enquanto uma grande distribuição de Linux não adotar o PowerShell e colocá-lo por padrão nas suas imagens. E com todo esse amor entre Canonical e Microsoft, não duvido nada ele aparecer por padrão no Ubuntu. Eu certamente vou utilizá-lo como mais uma opção, principalmente quando estiver vivendo entre Linux e Windows.

Com isso, já temos .NET, SQL Server, e agora PowerShell no Linux. É realmente uma nova Microsoft.

O que vocês acham da novidade? Vai pegar? Deixem suas opiniões aqui nos comentários.