Ferramentas de linha de comando para desenvolvedores
Publicados: 2022-03-11No mundo online de hoje, a batalha para atrair usuários continua acirrada, com os fabricantes de aplicativos preferindo aplicativos móveis ou da web. Os aplicativos de desktop estão se tornando cada vez menos relevantes. Além disso, eles também tendem a ser nada mais do que clientes ricos para aplicativos da Web – sendo o Electron a plataforma popular de escolha.
Isso significa que em breve abandonaremos o desktop como plataforma? Não, claro que não, eu não diria isso. Além disso, embora os aplicativos GUI pareçam ter parado recentemente, há um segmento de aplicativos de desktop que continua a crescer.
Você já viu algum filme com hackers? Na maioria das vezes, essas pessoas são mostradas trabalhando na frente de monitores exibindo algum tipo de terminal (geralmente com fundo escuro e primeiro plano claro). Este terminal, por sua vez, tende a ser inundado com personagens passageiros que aparentemente têm algum significado para quem os assiste.
Tais representações de hackers em ação são muitas vezes ridicularizadas por desenvolvedores profissionais, e existem até alguns programas que simulam vários efeitos de “hacker”, apenas por diversão.
No entanto, no mundo real, as ferramentas de linha de comando não são usadas por seu valor de entretenimento.
Por que ainda usamos ferramentas de interface de linha de comando
Este artigo se concentra no lado prático do uso de ferramentas de interface de linha de comando (CLI). Conhecer os comandos da CLI e usar ferramentas de qualidade pode torná-lo mais produtivo e também pode abrir portas para várias abordagens de automação que são muito mais práticas com interfaces textuais do que com aplicativos GUI.
Você pode melhorar a execução de tarefas repetitivas na GUI, a ponto de seus vários cliques serem ouvidos como um único e longo. O problema é que isso ainda não superará a eficiência de um script especializado. Além disso, realizar as mesmas operações manualmente introduz uma carga cognitiva adicional e uma maior possibilidade de erro humano. Como sempre, contamos com computadores para lidar com tarefas que os humanos podem achar chatas, repetitivas ou esmagadoras.
Vale saber que uma ferramenta de terminal pode oferecer vários tipos de interfaces. Existem outros não interativos como ls, que simplesmente pegam os parâmetros e fornecem a saída. Existem interfaces interativas ou semi-interativas mais frequentemente encontradas em gerenciadores de pacotes. (“Tem certeza de que deseja continuar com a instalação a partir de uma fonte não verificada?”) Em seguida, existem interfaces de usuário textuais (TUIs), que são aplicativos GUI interativos projetados para atender às limitações de um terminal. Provavelmente o mais famoso é o Midnight Commander (mc), um clone do extremamente popular (nos anos 90) Norton Commander.
Ferramentas essenciais de linha de comando
Se você quer se tornar um morador de console, você precisa se equipar com um conjunto mínimo de ferramentas de desenvolvedor de linha de comando - o essencial. As coisas que você definitivamente não pode viver sem são um shell interativo (apontar para algo moderno com tab-completion conveniente) e um editor de texto .
Agora, vou mencionar a filosofia UNIX , que muitas vezes é a base por trás das decisões de design feitas pelos autores da ferramenta, conscientemente ou não. Alguns dos principais pontos podem ser resumidos da seguinte forma:
- Trate tudo como um arquivo.
- Faça apenas uma coisa, mas faça bem.
- Leia da entrada padrão, grave na saída padrão e comunique erros a um fluxo de erro padrão.
- Quando bem-sucedido, retorna o código 0. Um valor diferente de zero significa um erro (que pode ser especificado pelo código de retorno exato).
- Permitir o encadeamento de comandos e scripts.
Casca
A primeira coisa que você vê ao abrir um terminal é um shell. Esta é a parte que possibilita a interação entre o usuário e a máquina. Ele interpreta seus comandos, os divide em nomes de programas e argumentos e executa todos os comandos de shell que você lança nele.
Historicamente, houve muitos tipos diferentes de conchas. Entre os mais populares estavam o csh (C Shell) e várias implementações do Bourne Shell (geralmente conhecido simplesmente como sh ). Bourne Shell foi estendido para Korn Shell, que também ganhou força e ainda está sendo usado por seus entusiastas. Csh é atualmente o shell padrão em alguns sistemas BSD, enquanto quase todos os outros sistemas operacionais do tipo UNIX preferem algum tipo de Bourne Shell. As distribuições Linux tendem a favorecer o bash, enquanto o Mac OS X vem com o zsh como a escolha padrão.
Existem outras possibilidades por aí, mas são muito menos populares, exceto o Microsoft PowerShell em sistemas Windows. O PowerShell é inspirado em parte pelos shells interativos do UNIX, como zsh, e em parte pelo tempo de execução .NET. Em vez de tratar tudo como texto, um conceito comum no mundo UNIX, permite a manipulação de dados orientada a objetos.
Embora o Microsoft PowerShell seja bastante popular no domínio do Windows, muitos programas com origens UNIX (o mais notável é Git, Autotools ou Make) tendem a preferir alguma variação do Bourne Shell. Por causa disso, surgiram projetos como msys (empacotado com Git para Windows), Cygwin ou o recente WSL da Microsoft. Se você quer uma sensação semelhante ao Linux no Windows, o MSys é a melhor escolha aqui. Se você deseja um ambiente Linux completo capaz de executar binários padrão do Linux, o WSL é o caminho a seguir. Para algo intermediário - API UNIX, mas compilado como um executável do Windows (use-o apenas quando você realmente sabe por que precisa disso) - Cygwin é a resposta.
editor
Depois de se familiarizar com o seu shell, você vai querer adquirir algumas habilidades úteis. Como a maior parte do trabalho de codificação gira em torno da escrita de texto (código, READMEs, mensagens de commit), é essencial um bom conhecimento de editores de texto interativos. Há muitos para escolher, e como um editor é uma das ferramentas mais necessárias para qualquer desenvolvedor, provavelmente há tantas opiniões sobre qual editor é o melhor.
Os editores de texto mais populares podem ser separados em dois grupos básicos: Editores de texto simples e editores de texto programáveis .
Ambos podem ser ótimos para escrever código, mas, como o nome sugere, os programáveis oferecem a capacidade de moldar e personalizar o editor para atender perfeitamente às suas necessidades. No entanto, isso tem um preço, pois eles também tendem a ter uma curva de aprendizado mais acentuada e podem exigir mais tempo para serem configurados.
Editores de texto básicos
Entre os editores de texto simples, o GNU Nano é o mais difundido. Na verdade, é um clone do editor pico, então se um não estiver disponível em seu sistema, você pode tentar o outro. Outra alternativa mais moderna para ambos é o micro editor. Se você quer algo simples e extensível ao mesmo tempo, este é um bom lugar para começar.
Editores de texto programáveis
Muitos desenvolvedores contam com editores programáveis de diferentes campos, como Vim e GNU Emacs. Ambos os editores podem ser executados no console ou no modo GUI, e ambos tiveram impacto nas combinações de teclas encontradas em outros softwares. Ambos oferecem não apenas uma API, mas também linguagens de programação reais incorporadas. O Emacs se concentra em LISP e o Vim usa seu próprio VimL, mas também oferece interfaces para outras linguagens de script populares (como Lua, Perl, Python ou Ruby). Uma abordagem mais recente ao Vim, chamada Neovim, também vale a pena mencionar, pois está começando a ter seguidores sérios.
Pode ser um pouco confuso, mas também existe um editor chamado vi que é um antecessor do Vim (que, aliás, significa “ Vi i mproved ”). É muito mais simples que o Vim, mas se você tiver confiança suficiente para escrever no Vim, não deve ser um desafio para você se precisar usar o vi.
Como o pico/GNU Nano e o vi/Vim geralmente são pré-instalados em vários sistemas, é uma boa ideia pelo menos entender o básico (sair do Vim é um problema notoriamente difícil para iniciantes). Dessa forma, se você precisar editar algo em uma máquina remota, estará pronto independente de qual editor já esteja lá. Em seu dispositivo privado, sinta-se à vontade para usar qualquer editor que achar mais confortável.
Editor de sistema padrão
Uma última coisa a notar é que seu sistema pode ter o que é chamado de editor padrão .
A variável de ambiente $EDITOR aponta para o editor padrão e em shells compatíveis com Bourne (sh, bash, ksh, zsh) você pode vê-la digitando echo $EDITOR . Se o valor for diferente de sua escolha pessoal, você pode configurá-lo adicionando export EDITOR=my-awesome-editor à configuração de tempo de execução do seu shell ( ~/.profile , ~./bashrc , ~/.zshrc e assim por diante).
Outros programas, como sistemas de controle de versão e clientes de e-mail, usarão este editor quando precisarem de uma entrada de texto mais longa.
Multiplexador
Assim que você começar a fazer coisas sérias na CLI, você encontrará a limitação de poder manter apenas um aplicativo aberto a qualquer momento. Ao codificar, você pode editar o código, executá-lo, corrigir os erros e executar novamente. Ao procurar um bug, você pode querer listar os logs e ver o que é registrado quando você envia uma solicitação ao servidor. Normalmente, isso significaria alternar constantemente entre os dois aplicativos ou abrir várias janelas de terminal.
É aqui que um multiplexador de terminal pode ajudá-lo. Ao falar de multiplexadores, algumas pessoas imediatamente assumem que o tópico é GNU Screen. Foi a primeira ferramenta difundida desse tipo e ainda é muito popular hoje (muitas vezes sendo instalada por padrão). Seu substituto moderno é o tmux que, sem surpresa, significa “ terminal multiple x er”.
Esses dois permitem que você tenha mais de uma janela aberta em uma determinada sessão de terminal e alterne entre essas sessões livremente. Eles permitem que você divida as janelas em painéis, o que ajuda a executar vários aplicativos ao mesmo tempo e observar sua saída em tempo real (sem alternar nenhuma janela). Além disso, eles funcionam em modo cliente-servidor, o que significa que você pode desanexá-los a qualquer momento e voltar mais tarde para continuar o trabalho exatamente de onde parou. Este último recurso levou à popularidade do Screen quando as pessoas queriam sessões de IRC persistentes.

Para a maioria dos casos de uso, GNU Screen ou tmux devem ser ótimos para você, mas se por algum motivo você considerar que eles são muito pesados em recursos, também existem alternativas mais leves. Há dtach/atach e há abduco. Eles são limitados em escopo de propósito, mas podem desempenhar bem suas respectivas funções.
Gerenciador de pacotes
Neste ponto, você pode começar a pensar em instalar todos os softwares mencionados acima em sua máquina. Um problema é que cada uma das ferramentas tem instruções de instalação diferentes. Às vezes, você precisa baixar os fontes e compilá-los você mesmo, às vezes você obtém o binário autocontido e às vezes obtém o que é chamado de pacote binário , o que geralmente significa um executável compactado junto com alguns metadados.
Para facilitar o processo de instalação de software, os criadores de sistemas operacionais vieram com um conceito de gerenciadores de pacotes. Simplificando, um gerenciador de pacotes é como uma loja de aplicativos para CLI e aplicativos de desktop. Ele precede as lojas de aplicativos reais em algumas décadas. O problema é que quase todo sistema tem seu próprio gerenciador de pacotes. Debian, Ubuntu e distribuições GNU/Linux derivadas usam APT, distribuições baseadas em Red Hat preferem yum ou DNF, outras distribuições Linux têm meios mais exóticos de instalação de software, assim como diferentes clones BSD. Além de gerenciadores de pacotes integrados, também existem gerenciadores de pacotes instalados pelo usuário, como Chocolatey para MS Windows e Homebrew para Mac OS X/macOS. Quando você quer escrever instruções sobre como instalar seu programa, você pode acabar escrevendo casos para cada um desses sistemas. Parece um pouco demais, não é?
Felizmente, o último dos sistemas mencionados, Homebrew, pode ser o mais portátil, graças ao Linuxbrew, um porte do Homebrew para sistemas GNU/Linux. O engraçado é que até funciona no WSL se você quiser ter uma experiência de usuário semelhante no Microsoft Windows. No entanto, lembre-se de que o WSL não é oficialmente suportado.
Então, além da portabilidade, o que mais o Homebrew pode oferecer? Em primeiro lugar, ele não interfere nos pacotes do sistema, então tudo que você instala fica em uma camada separada do sistema operacional. Além disso, geralmente não são necessárias permissões de root para instalar pacotes. Você pode, portanto, ter pacotes de sistema estáveis e testados, mas ao mesmo tempo verificar suas versões mais recentes sem sacrificar a estabilidade do sistema.
Se você quiser testar os editores, mencionei anteriormente que tudo o que você precisa fazer em um sistema com Homebrew ou Linuxbrew é executar este comando:
brew install emacs micro nano vim neovim .
As coisas brilhantes
O que já discutimos é, sem dúvida, útil para o trabalho. Mas também existem aplicativos que, embora não sejam necessários, ainda trazem conforto para o dia a dia. Você pode não precisar deles, mas sempre vale a pena conhecê-los.
Filtro interativo
Pesquisar o histórico de comandos pode ser tedioso. Enquanto o bash e o zsh apresentam a combinação de teclas Ctrl+R, ele mostra apenas uma substituição por vez. Além disso, você precisa inserir o texto exato que usou antes. Como esta é uma operação bastante comum, uma vez que você começa a usar a linha de comando, parece um bom lugar para melhorias.
Filtros interativos, como fzy, percol, peco ou fzf, ajudam você a filtrar longas linhas de texto. Isso pode ser o histórico de comandos mencionado acima, todas as linhas de código em um diretório de projeto ou uma lista de nomes de arquivos gerados por find . . A ideia geral aqui é apresentar a você primeiro todas as linhas disponíveis e depois contar com algoritmos de descoberta difusa para filtrar tudo o que não corresponde.
Por exemplo, vincular Ctrl+R a fzf mostra uma lista dos comandos mais recentes, que você pode navegar para cima e para baixo usando as setas, ou pode digitar git para mostrar apenas comandos que apresentam Git em algum lugar dentro. Pessoalmente, quando trabalho com um shell que não possui um filtro interativo, de repente me sinto um pouco perdido. Esse recurso é realmente atraente!
Além disso, você pode disponibilizar seu filtro interativo dentro de seu editor de texto programável. Dessa forma, você terá recursos de pesquisa unificados entre seu shell e seu editor.
Navegador interativo
O PathPicker do Facebook foi de grande ajuda quando eu trabalhava principalmente com projetos C++. O log de erros gerado pelo compilador pode ficar muito grande e bastante desagradável, e a capacidade de encontrar os caminhos reais dentro desse log foi um benefício de produtividade.
Em qualquer arquivo de texto, ou no conteúdo de sua tela quando usado com tmux, o fpp filtra tudo, menos os caminhos do arquivo. Em seguida, ele apresenta uma interface do usuário onde você pode selecionar um ou mais desses caminhos e executar um comando com eles. A resposta mais comum seria abrir os arquivos em um editor, claro, que é a ação padrão.
IU do Git
Provavelmente, pelo menos um dos projetos em que você trabalha usa o Git como um sistema de controle de versão. Embora seja totalmente poderoso, o Git CLI não é o auge da excelente experiência do usuário. Para poupar algum estresse lendo todas as opções na ajuda do Git $SUBCOMMAND , recomendo que você verifique tig. Ele oferece uma interface de usuário de console agradável para as operações que se beneficiam dele, como log ou blame .
Outra ferramenta que visa ajudar os usuários do GIt é o fac, que é um acrônimo para Fix All Conflicts . Como você deve ter adivinhado, é útil quando você se depara com conflitos ao fazer merges ou rebases. É uma alternativa a outras ferramentas de mesclagem como o vimdiff.
Gerenciador de arquivos
Houve uma época nos anos 90 em que todo mundo queria um gerenciador de arquivos de dois painéis. A tendência começou com o Norton Commander. Muitos outros seguiram o mesmo caminho, mas aquele que ainda vê uma base de usuários estável é o Midnight Commander. O caso de uso mais óbvio é usar mc para manipular arquivos locais, mas também é muito útil ao trabalhar com máquinas remotas.
Como a maioria dos programas de linha de comando, é muito leve, então não há problema em executá-lo em ssh e graças ao suporte aos protocolos FTP e FISH, você pode ter um sistema de arquivos local visível em um painel e o remoto no outro - um conveniente recurso quando você deseja evitar digitar ou copiar nomes de arquivos como argumentos para scp.
Ferramentas CLI apenas por diversão
“Todo trabalho e nenhuma diversão fazem de Jack um garoto chato” , dizem eles. Existem muitos programas, linha de comando e outros, que servem apenas para sua diversão. O videogame Rogue se enquadra nessa categoria. Até deu nome a todo o gênero de jogos! Outros brinquedos populares são fortuna e cowsay, que podem tornar seu dia um pouco menos monótono se você usá-los em algum lugar em seus scripts de CI, por exemplo.
Mas para alguns de nós, o principal apelo de usar um console em primeiro lugar é se sentir como um hacker nos filmes. No More Secrets e Hollywood Hacker representam bem esse grupo. Experimente quando alguém estiver observando você trabalhar, e sua credibilidade como hacker certamente aumentará!
Linha de comando na prática
Então, o que há de tão atraente na linha de comando que compensa as horas gastas aprendendo a usar o shell, o editor e todas as opções de vários aplicativos? A resposta curta é produtividade , que vem de duas coisas:
Uma é que quando você é apresentado apenas a uma janela de terminal e nada mais, você pode se concentrar mais intensamente, pois não há muito para distraí-lo. Nenhuma notificação aparecendo, sem anúncios, sem fotos de gatinhos bonitos. Apenas você e seu objetivo.
A segunda coisa é a automação. Você pode colocar várias ações combinadas com frequência em um script e chamá-lo mais tarde como um todo, em vez de digitá-las todas à mão a cada vez. Você pode retornar rapidamente a um comando particularmente complexo que escreveu uma vez pesquisando no histórico do seu shell. Basicamente, você pode gravar e reproduzir qualquer coisa, e o código está disponível como uma documentação do que você fez.
A capacidade de adicionar aliases também contribui para os ganhos. Por exemplo, muitas vezes me vejo criando commits no Git atualizando o mesmo até que esteja perfeito (no momento). Depois de preparar os arquivos desejados, executo git carmh . Não tente procurar no manual, pois é meu alias privado que significa commit --amend --reuse-message=HEAD . Ele salva alguma digitação com certeza.
O problema é que as pessoas ficam entediadas repetindo as mesmas ações repetidamente, e o tédio reduz o foco. Isso pode levar a erros e erros. A única maneira de evitá-los é não entrelaçar ações de alto e baixo foco. Escrever código é um foco alto e revisar uma mensagem e conteúdo de commit é um foco alto, mas quando você precisa repetir vários cliques mecânicos aqui e ali para chegar ao estágio de revisão de commit, é provável que seu foco seja reduzido. A linha de comando não está, é claro, livre de tais atividades mecânicas, mas graças à automação, você pode evitar a maioria delas.
Explorações adicionais
Você já deve estar ciente de algumas ou todas as ferramentas de linha de comando mencionadas neste artigo. Você pode ter aprendido algo novo e útil ao lê-lo. Se sim, excelente - meu objetivo aqui não era oferecer uma visão abrangente e comparação de diferentes ferramentas, mas demonstrar algumas ferramentas cruciais que considero úteis no meu trabalho diário, na esperança de que você possa achar algumas delas úteis, também.
Existem programas de linha de comando muito mais interessantes por aí e, se você estiver interessado neles, recomendo verificar a lista com curadoria do Awesome Shell de algumas das melhores ferramentas de linha de comando disponíveis hoje.
A maioria dos aplicativos de GUI tem sua contraparte de terminal. Isso inclui navegadores da Web, clientes de e-mail, clientes de bate-papo (IRC, Slack, XMPP), suítes PIM ou planilhas. Se você conhece algum bom programa que eu não mencionei, por favor, traga-o nos comentários.
