72 pontos por GN⁺ 2026-03-27 | 3 comentários | Compartilhar no WhatsApp
  • Resumo de como usar várias teclas de atalho e combinações de comandos para aumentar a velocidade e a eficiência no ambiente de shell
  • Com atalhos básicos como CTRL + W, U, K, Y para editar linhas, CTRL + A/E, ALT + B/F para mover o cursor e reset para recuperar o terminal
  • No Bash e no Zsh, é possível usar CTRL + R para buscar no histórico de comandos, reutilizar comandos anteriores com !!·!$·ESC+. e automatizar tarefas repetitivas com Brace Expansion e Globstar
  • Recursos avançados como Process Substitution, tee e bg/disown tornam mais eficiente o controle de processos e o gerenciamento de logs
  • Se você dominar o shell como uma caixa de ferramentas, poderá aumentar a produtividade e o foco; o segredo é transformar os atalhos em hábito, um por vez

Atalhos e recursos básicos que funcionam em quase todo shell

  • A combinação CTRL + W, U, K, Y** é um conjunto de atalhos de edição de linha que permite apagar ou restaurar rapidamente palavras ou partes da linha com base na posição do cursor

    • CTRL + W apaga a palavra antes do cursor
    • CTRL + U recorta do cursor até o início da linha, e CTRL + Y permite colar novamente
    • CTRL + K recorta do cursor até o fim da linha
    • CTRL + A / E vai para o começo e o fim da linha, e ALT + B / F move para trás ou para frente por palavra
    • Na maioria dos terminais isso já vem ativado por padrão; no Mac, é preciso configurar a tecla Option como Meta para funcionar
    • Os comandos reset ou stty sane recuperam o terminal quando ele quebra após exibir um arquivo binário por engano
    • Mesmo com a tela corrompida, ainda é possível digitar; basta inserir reset e pressionar Enter para restaurar
    • CTRL + C / D enviam, respectivamente, um sinal para interromper o comando e um sinal EOF (fim de arquivo)
    • Pressionar CTRL + D em um prompt vazio encerra o shell
    • CTRL + L limpa a tela imediatamente, da mesma forma que o comando clear
    • Mantém o comando em edição e move o prompt para o topo da tela
    • cd - volta imediatamente ao diretório anterior, e pushd / popd permitem navegar entre vários locais usando uma pilha de diretórios
    • > file.txt esvazia o arquivo sem apagá-lo, preservando permissões e propriedade
    • A variável $_ reutiliza o último argumento do comando anterior
    • Exemplo: mkdir -p /path/newdir && cd "$_"
    • set -e e set -u são opções que aumentam a segurança de scripts
    • set -e encerra imediatamente em caso de erro
    • set -u trata como erro a referência a variáveis não definidas
    • A combinação set -euo pipefail oferece uma proteção ainda mais forte

Atalhos e recursos avançados no Bash e no Zsh

  • CTRL + R executa uma busca incremental reversa no histórico de comandos
    • Ao digitar uma palavra-chave, é possível encontrar e reutilizar imediatamente comandos passados
  • !! reexecuta o comando anterior inteiro
    • Com sudo !!, é possível reexecutar o comando imediatamente anterior com privilégios de administrador
  • CTRL + X, CTRL + E abre o comando em edição no editor padrão (Vim, Nano etc.) para modificar e executar depois
    • No Zsh, isso exige configuração separada
    • O comando fc é a forma tradicional de abrir um comando anterior no $EDITOR para edição
  • ESC + . ou ALT + . insere o último argumento do comando anterior na posição do cursor
    • Ao repetir a combinação, é possível percorrer os argumentos de comandos ainda mais antigos
    • !$ faz a mesma coisa de forma não interativa
  • Brace Expansion** é o recurso de expansão com chaves que reduz digitação repetitiva

    • cp pf.conf{,.bak}cp pf.conf pf.conf.bak
    • mv filename.{txt,md}mv filename.txt filename.md
    • mkdir -p project/{src,tests,docs} cria vários diretórios
    • Process Substitution <(command) trata a saída de um comando como se fosse um arquivo
    • Exemplo: diff <(sort file1.txt) <(sort file2.txt) compara sem criar arquivos temporários
    • Globstar(**) permite buscar arquivos recursivamente em subdiretórios
    • No Bash, é ativado com shopt -s globstar; no Zsh, vem ativado por padrão
    • Exemplo: ls **/*.js busca arquivos JS em todas as subpastas
  • A combinação CTRL + Z**,** bg**,** disown** permite** executar processos em segundo plano e desvinculá-los do shell

    • CTRL + Z suspende → bg envia para segundo plano → disown desvincula do shell
    • Assim, o processo pode continuar mesmo após encerrar a sessão SSH
    • command |& tee file.log envia ao mesmo tempo a saída padrão (stdout) e a saída de erro (stderr) para o pipe
    • |& é a forma abreviada de 2>&1 |
    • Com tee, é possível exibir na tela e salvar no log ao mesmo tempo

Conselhos centrais para usar melhor o shell

  • O shell é uma caixa de ferramentas e, quando bem dominado, pode aumentar muito a produtividade
  • Em vez de tentar decorar todos os atalhos de uma vez, o mais eficaz é transformá-los em hábito aos poucos
  • É possível simplificar o fluxo de trabalho reduzindo entradas repetitivas e digitação desnecessária
  • Quando você se acostuma, o terminal deixa de ser um obstáculo e passa a ser o seu espaço de trabalho

3 comentários

 
phoon 2026-03-30

Quase tudo são keybindings do emacs, mas quase não se fala do Emacs em si, e ver isso sendo muito compartilhado hoje em dia como se fossem dicas me dá uma sensação de como os tempos mudaram. A biblioteca readline basicamente implementou os keybindings do Emacs em tudo. Parece que já faz quase 20 anos desde que quase todo mundo migrou para IDEs, mas, do ponto de vista de um fóssil que ainda usava algo como gdbtui, continuo achando que o que é bom não morre.

 
GN⁺ 2026-03-27
Comentários no Hacker News
  • Senti que minha vida mudou quando remapeei a tecla de seta para cima
    Agora, em vez de percorrer todos os comandos, ele busca só os comandos que começam com o texto que eu já digitei
    Por exemplo, se eu digitar tar - e apertar a seta para cima, ele já mostra as opções de tar que usei antes
    No zsh, dá para configurar assim

    bindkey "^[OA" up-line-or-beginning-search # Up  
    bindkey "^[OB" down-line-or-beginning-search # Down
    
    • Depois que você começa a usar CTRL+r, nunca mais volta para a seta para cima
    • Acho um divisor de águas total. Para fazer algo parecido no bash, adicione isto ao .inputrc
      "\e[A":history-search-backward  
      "\e[B":history-search-forward
      
    • No fish shell, esse é o comportamento padrão. Ele navega pelos comandos com as setas para cima/baixo com base na palavra digitada, e com alt+cima/baixo dá até para navegar só pelos argumentos
    • Também dá para implementar a mesma coisa no .inputrc
    • Eu deixo as setas para cima/baixo como estão e, em vez disso, configuro ctrl+p e ctrl+n desse jeito
  • Ativar o vim-mode no terminal deixa tudo bem mais confortável
    Errou três palavras atrás? 3bcw e pronto
    Para apagar a linha inteira, cc; para edições mais complexas, dá para abrir direto no (neo)vim com v
    Se você já usa (neo)vim, é ótimo porque não precisa decorar novos atalhos

    • Isso me lembra um trecho antigo do manual do Emacs. Em vez de comandos complexos, eu gostaria de recomendar configurações do mouse
    • Uso (n)vim há mais de 20 anos, mas odeio o vi-mode no shell. Quando preciso de comandos complexos, abrir no neovim com ctrl-x+e é um bom meio-termo
    • Eu também uso vim com frequência, mas não no shell. Em vez disso, uso atalhos estilo Emacs (ctrl-a, ctrl-e etc.) no macOS inteiro. Acho que o vim deveria suportar bindings do emacs no modo insert
    • Foi a primeira vez que ouvi falar do recurso chamado “readline vi-mode”. Vou procurar mais sobre isso
    • Não entendo por que o modo emacs é o padrão. Quando abro um shell novo, a primeira coisa que digito é set -o vi
  • Achei marcante a ideia de alguém colocar um script chamado \# no PATH para poder comentar partes de um pipeline

    #!/bin/sh
    cat
    
    • Eu uso um truque parecido. Tenho um arquivo ~/bin/noglob com
      #!/bin/sh
      $*
      
      assim eu evito conflitos com noglob quando chamo scripts zsh a partir do bash
    • Eu uso comentários com parênteses. É bom para documentar scripts, mas no shell interativo é meio incômodo. Ainda assim, é uma forma criativa de comentar e achei divertido
    • Fico curioso sobre qual seria a vantagem disso em comparação com mycmd1 #| mycmd2
    • Isso é realmente útil, então vou adicionar ao meu $PATH
  • CTRL+W normalmente apaga até o espaço em branco anterior, então remove /var/log/nginx/ inteiro
    Alt+Backspace apaga até o caractere não alfabético anterior
    Só é preciso tomar cuidado porque isso conflita com o atalho para fechar abas do navegador

    • A partir do Firefox v147, foi adicionada a possibilidade de redefinir atalhos. Link relacionado
    • No macOS, os atalhos da interface gráfica e os do terminal são separados, então esse problema não existe. ⌘C, ⌘W etc. funcionam da mesma forma também no terminal
    • No meu ambiente (fish + Alacritty), acontece o contrário. Mesmo assim, felizmente dá para restaurar a aba fechada com Ctrl-Shift-T
    • Se você remover / da configuração $WORDCHARS, obtém o comportamento desejado (link de referência)
    • Dá para restaurar a aba imediatamente com Ctrl-Shift-T
  • Recomendo fazer um upgrade na busca do histórico com a integração de shell do fzf
    Vídeo de demonstração / Documentação oficial

  • Tenho um truque que uso bastante
    Quando estou digitando um comando longo e preciso fazer outra coisa antes, em vez de cancelar com Ctrl-C, eu comento e executo para deixar no histórico

    $ long_command  
    $ #long_command  
    $ stuff_1  
    $ stuff_2  
    $ #long_command  
    $ long_command
    
    • No zsh, isso dá para fazer com o binding "push-line-or-edit", e no bash dá para chegar em algo parecido com C-u seguido de C-y
    • Um jeito ainda mais fácil é usar ctrl-u para salvar e limpar a linha atual, e depois ctrl-y para colar de volta. No zsh, o alt-q pode automatizar esse processo
    • No bash, alt-shift-3 pode colocar # no começo do comando atual e ir para uma nova linha
  • Não gosto muito de títulos com cara de LLM, mas algumas dicas são úteis e pretendo testar
    É uma pena que brace expansion não combine tão bem com autocompletar por tab. Seria legal ter mais recursos, como duplicar o último token ou remover a extensão de um arquivo

    • O estilo do texto em si também parece de LLM. Por exemplo, frases como “The shell is a toolbox, not an obstacle course.”
    • O PowerShell também tem modo readline, o que reduz a fricção ao alternar junto com o WSL
    • O readline funciona como se fosse parte do bash, então acho válido chamar essas dicas de recursos do shell
  • Uso uma função na configuração do zsh para excluir certos comandos do histórico
    Por exemplo, para que comandos perigosos como --force não fiquem registrados no histórico

    function zshaddhistory() {
      emulate -L zsh
      if ! [[ "$1" =~ "(^ |--force|whatever)" ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
      else
        return 1
      fi
    }
    
    • Eu faço algo parecido criando aliases que colocam um espaço no começo dos comandos que não quero registrar
      unhist () { alias $1=" $1"; }
      unhist unhist
      unhist fzf
      unhist rghist
      
  • Uso um snippet no zsh para implementar expansão automática de aliases globais
    Por exemplo, se você definir alias -G G='rg -s', ao digitar command | G ele se expande automaticamente para command | rg -s
    A expansão acontece automaticamente ao apertar espaço, e se você digitar \alias, a expansão é ignorada

  • Tenho uma função “deep cd” no .bashrc
    Ela vai automaticamente para o primeiro diretório que contém a string passada como argumento

    dcd() {
      [ -z "$1" ] && return
      local dir
      dir=$(find . -type d -path "*$1*" -print -quit 2>/dev/null)
      [ -n "$dir" ] && cd "$dir"
    }
    

    No começo achei que seria lento, mas acabei usando isso com bastante frequência

    • Também vale dar uma olhada em ferramentas de cd inteligente como jc do autojump, z e fzf
 
phoon 2026-03-30

Sobre o remapeamento da seta para cima ali em cima, usuários de Emacs simplesmente fazem isso com c-r. No fim das contas, o ápice do tuning é o padrão.