- 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
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.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 antesNo zsh, dá para configurar assim
.inputrc.inputrcAtivar o vim-mode no terminal deixa tudo bem mais confortável
Errou três palavras atrás?
3bcwe prontoPara apagar a linha inteira,
cc; para edições mais complexas, dá para abrir direto no (neo)vim comvSe você já usa (neo)vim, é ótimo porque não precisa decorar novos atalhos
ctrl-x+eé um bom meio-termoctrl-a,ctrl-eetc.) no macOS inteiro. Acho que o vim deveria suportar bindings do emacs no modo insertset -o viAchei marcante a ideia de alguém colocar um script chamado
\#no PATH para poder comentar partes de um pipeline~/bin/noglobcom assim eu evito conflitos com noglob quando chamo scripts zsh a partir do bashmycmd1 #| mycmd2$PATHCTRL+W normalmente apaga até o espaço em branco anterior, então remove
/var/log/nginx/inteiroAlt+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
/da configuração$WORDCHARS, obtém o comportamento desejado (link de referência)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"push-line-or-edit", e no bash dá para chegar em algo parecido comC-useguido deC-yctrl-upara salvar e limpar a linha atual, e depoisctrl-ypara colar de volta. No zsh, oalt-qpode automatizar esse processoalt-shift-3pode colocar#no começo do comando atual e ir para uma nova linhaNã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
Uso uma função na configuração do zsh para excluir certos comandos do histórico
Por exemplo, para que comandos perigosos como
--forcenão fiquem registrados no históricoUso um snippet no zsh para implementar expansão automática de aliases globais
Por exemplo, se você definir
alias -G G='rg -s', ao digitarcommand | Gele se expande automaticamente paracommand | rg -sA expansão acontece automaticamente ao apertar espaço, e se você digitar
\alias, a expansão é ignoradaTenho uma função “deep cd” no
.bashrcEla vai automaticamente para o primeiro diretório que contém a string passada como argumento
No começo achei que seria lento, mas acabei usando isso com bastante frequência
jcdo autojump, z e fzfSobre 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.