Um turno de sysadmin em PME vive de repetição: os mesmos logs, os mesmos reinícios de serviço, o mesmo destino de ssh para a máquina dos backups, o mesmo ficheiro de sistema a editar pela terceira vez no dia. O bash já traz o tempo de escrita a menos, na forma de atalhos com nome próprio na documentação. Nada disto precisa de plugin ou de outra shell: são funções do Readline e expansões do próprio bash que o manual GNU nomeia — mas o alias só existe depois de o definires, o !! e o Alt+. trabalham em shell interactivo e o Alt pressupõe Meta activo (no Terminal ou iTerm do macOS liga Option as Meta, ou envia Esc antes da tecla).
Os nomes entre parêntesis nas secções — reverse-search-history, yank-last-arg, insert-comment, unix-line-discard — são os do manual GNU do bash e do manual do Readline. As teclas mostradas são as ligadas por omissão em modo emacs, e a secção do bind -P mostra como listar as ligações reais do teu sistema. Os comandos usam caminhos de exemplo: os teus têm o mesmo formato.
Neste artigo
- 1. Ctrl+R: reencontrar o comando no histórico
- 2. sudo !!: repetir o último comando como root
- 3. Alt+.: o último argumento, sem o escrever
- 4. cd -: voltar à directoria anterior
- 5. Ctrl+A e Ctrl+E: mover pela linha, e o Alt+# antes de perder
- 6. sudo tee: escrever em ficheiros do root
- 7. {a,b,c}: gerar variantes num comando só
- 8. Ctrl+U e Ctrl+Y: cortar e colar a linha
- 9. Ctrl+Z e fg: suspender e retomar
- 10. alias: palavras curtas para os comandos de sempre
- 11. Bónus: bind -P, o cheat-sheet do teu bash
- Em Resumo
- Fontes Oficiais
- Artigos Relacionados
1. Ctrl+R: reencontrar o comando no histórico
O atalho ataca o comando que já escreveste nos dias anteriores. A função liga Ctrl+R ao reverse-search-history do Readline: pesquisar para trás desde a linha actual, em pesquisa incremental — a cada letra, o bash mostra a correspondência mais recente do histórico e posiciona o cursor no pedaço correspondente da linha recuperada — o destaque a cor é do fish ou do zsh, o bash não pinta nada. Enter executa a linha encontrada, e uma tecla de cursor sai da pesquisa e deixa o comando aberto para edição antes de correr. Repetir Ctrl+R salta para a correspondência anterior.
(reverse-i-search)`systemctl stop nginx': systemctl stop nginx
(reverse-i-search)`journalctl -u nginx': journalctl -u nginx
# são duas pesquisas distintas: escreveste outro padrão e o bash arrancou de origem — repetir Ctrl+R percorre os hits do mesmo padrão
É o atalho dos logs e das ligações: journalctl -u com unidade comprida, o ssh de longo curso e os comandos de certificado voltam em duas teclas em vez de vinte, porque basta o pedaço que os distingue no histórico.
2. sudo !!: repetir o último comando como root
O clássico: o comando de instalação que arrancou sem sudo. O !! é um designador de evento do manual do bash: aponta para a entrada anterior do histórico, sinónimo de !-1. O bash expande-o antes de executar a linha, por isso o sudo !! repete o comando anterior com root à frente, sem o reescrever.
apt install fail2ban
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock, are you root?
sudo !!
sudo apt install fail2ban
# a última linha saiu de !!: o bash fez eco da linha expandida antes de executar
Compensa nas instalações e nas escritas de config: a repetição à mão é a parte que introduz gralhas novas, e o !! elimina essa margem. O root entra no comando expandido, não nas redirecções: a seta abre com o teu shell mesmo depois do sudo, e é por isso que a escrita em ficheiro do root tem secção própria mais adiante. Quem preferir ver a linha expandida antes de executar activa shopt -s histverify — o manual descreve a opção como recarregar a expansão no buffer de edição do Readline para modificação.
3. Alt+.: o último argumento, sem o escrever
O manual liga Alt+. (também Alt+_) ao yank-last-arg: inserir o último argumento do comando anterior, a última palavra da entrada anterior do histórico. Chamadas seguintes recuam pelas entradas do histórico e inserem a última palavra de cada uma — o caminho que abriste no log anterior reaparece no comando seguinte.
less /var/log/auth.log
grep -c "Accepted publickey" /var/log/auth.log
# o caminho do grep saiu de um Alt+.: nem o /var/log nem o auth.log se escreveram
Nos turnos de diagnóstico poupa a fila de caminhos: o log que acabaste de abrir reaparece no grep seguinte, e o host que usaste no ssh reaparece no scp para o mesmo destino.
4. cd -: voltar à directoria anterior
Um argumento - no cd converte-se em $OLDPWD antes da mudança, e o manual descreve o $OLDPWD como a directoria anterior guardada pelo próprio cd. No sucesso com o - em primeiro lugar, o cd imprime o caminho absoluto da nova directoria, por isso vês para onde voltaste.
cd /etc/nginx
grep worker_connections nginx.conf
cd -
/home/ds
# o cd imprimiu o caminho absoluto da directoria para onde voltou
É a ida-e-volta das manutenções: /etc/nginx para a config, /var/log para o resultado, e as duas directorias vivem no mesmo cd repetido.
5. Ctrl+A e Ctrl+E: mover pela linha, e o Alt+# antes de perder
O cursor também poupa escrita. O manual liga Ctrl+A ao beginning-of-line (mover para o início da linha) e Ctrl+E ao end-of-line (mover para o fim) — a confirmação é prática: o bind -P da tua máquina mostra Home e End a chegar como sequências de escape ligadas às mesmas funções.
sudo systemctl restart nginx.service
# Ctrl+A leva o cursor ao início da linha, Ctrl+E ao fim
Compensa nos flags que se acrescentam no fim dos systemctl compridos e nas verificações de primeira palavra sem apagar o resto.
No mesmo grupo de escrita fica o Alt+#. O Readline chama insert-comment à função: insere o valor da variável comment-begin (o # por omissão) no início da linha, e a linha é aceite como se tivesses premido Enter — o bash executa um comentário, nada corre, e a linha fica no histórico para recuperar com a seta para cima ou com Ctrl+R, apagando o # inicial. Em vez do Ctrl+C, que descarta o que está na linha, o Alt+# guarda a escrita intacta. O manual nota a ligação de omissão: M-# em modo emacs e # em modo de comando vi.
rsync -avz /srv/site/ backup@nas:/srv/site/
# rsync -avz /srv/site/ backup@nas:/srv/site/
# a segunda é a primeira comentada pelo Alt+#: nada correu, a linha ficou no histórico
É o jeito dos comandos de manutenção compridos que o dia corta a meio: o rsync do backup e o find de limpeza ficam no histórico prontos para voltar.
6. sudo tee: escrever em ficheiros do root
A escrita em ficheiros do root é onde o anexo clássico falha. O manual do bash nota que as redirecções são interpretadas pelo shell antes de o comando executar: quem >> abre o ficheiro é o teu shell, sem root, e o sudo do comando seguinte chega tarde — daí o Permission denied. O tee inverte a ordem: recebe os bytes pelo pipe e é ele, já como root, que abre o ficheiro. A opção -a anexa em vez de sobrescrever.
echo 'net.ipv4.conf.all.rp_filter=1' >> /etc/sysctl.d/99-rp_filter.conf
bash: /etc/sysctl.d/99-rp_filter.conf: Permission denied
printf 'net.ipv4.conf.all.rp_filter=1\n' | sudo tee -a /etc/sysctl.d/99-rp_filter.conf
net.ipv4.conf.all.rp_filter=1
# o tee escreveu o ficheiro já como root e imprimiu a linha no ecrã
É o caso do /etc/sysctl.d e de /etc/security/limits.conf: uma linha nova numa config de sistema de produção, com a seta simples parada no Permission denied.
⚠ Atenção: o conteúdo entra em produção na própria escrita. Faz cópia do ficheiro antes (com cp -p) e valida o resultado com o teste próprio de cada caso: sysctl --system para o sysctl.d, sshd -t e nginx -t para as respectivas configs.
7. {a,b,c}: gerar variantes num comando só
O manual chama brace expansion ao mecanismo de gerar cadeias que partilham prefixo e sufixo comuns — pode faltar um dos lados. A expansão corre antes das outras, sem ordenar: a ordem é a esquerda-para-a-direita em que escreveste as variantes.
echo a{d,c,b}e
ade ace abe
mkdir -p /srv/site/{html,logs,certs}
cp nginx.conf{,.bak}
# o {,.bak} gera o nome original e o sufixo .bak no mesmo comando
Compensa na criação do esqueleto de /srv num só mkdir e nas cópias de segurança da config antes de editar — o mesmo comando grava o nome original e o .bak.
8. Ctrl+U e Ctrl+Y: cortar e colar a linha
O Ctrl+U liga ao unix-line-discard: apagar do cursor até ao início da linha, guardando o texto apagado no kill-ring. O Ctrl+Y liga ao yank: devolver o topo do kill-ring ao ponto de edição.
tar -czf /tmp/logs-09-11.tar.gz /var/log
# Ctrl+U corta a linha inteira do cursor para o início
# Ctrl+Y cola-a de volta quando fizer falta
O par guarda o comando que já estava escrito: limpares a linha antes de Enter quando o destino muda, e devolvê-la quando regressa — sem reescrita e sem gralha.
9. Ctrl+Z e fg: suspender e retomar
O manual chama job control ao conjunto: suspender a execução dos processos e retomá-la mais tarde. O carácter de suspensão — o Ctrl+Z típico — pára o processo em primeiro plano e devolve o controlo ao bash, que imprime a entrada do job e o fg retoma-o em primeiro plano e o jobs lista as suspensões.
vi /etc/nginx/nginx.conf
[1]+ Stopped vi /etc/nginx/nginx.conf
journalctl -u nginx -n 50 --no-pager
fg
# o editor volta no ponto exacto onde ficou
É a forma de um só terminal levar o turno: suspende o editor, lê o log, volta ao editor. Menos sessões ssh abertas e nenhum passo perdido entre ficheiros.
10. alias: palavras curtas para os comandos de sempre
Um alias substitui a primeira palavra de um comando simples pelo valor que lhe deres. Sem argumentos, o builtin imprime os alias definidos no formato reutilizável. As linhas guardam em ~/.bashrc para sobreviver ao fecho do terminal, e o unalias remove os que caem em desuso.
alias logs='tail -f /var/log/nginx/error.log'
alias st='systemctl status'
alias sshbak='ssh backup@nas'
st nginx
alias
# sem argumentos: a lista dos definidos, no formato reutilizável
Os três atalhos que o artigo usa repetem-se em todos os turnos PME: o status dos serviços com nome comprido, o log dos nginx e o ssh do backup diário. Curta o nome, não o comando: o alias vive onde te custa menos memorizá-lo.
11. Bónus: bind -P, o cheat-sheet do teu bash
O bónus é o teu bash a dizer o que tem activado. O manual do builtin bind descreve o -P como listar os nomes das funções Readline e as suas ligações actuais, e o -p como listar as mesmas no formato reutilizável — de que o manual faz o argumento de um bind seguinte ou o conteúdo de um ficheiro de inicialização do Readline.
bind -P | grep -E '(reverse-search-history|yank-last-arg|insert-comment|kill-region)'
insert-comment can be found on "\e#".
kill-region is not bound to any keys
reverse-search-history can be found on "\C-r".
yank-last-arg can be found on "\e.", "\e_".
bind -p | grep reverse-search-history
"\C-r": reverse-search-history
# o formato do bind -p é o de um ficheiro de inicialização do Readline
É o cheat-sheet vivo: o listado é a tabela do Readline carregada pelo teu bash — muda com a versão e com as escolhas do ~/.inputrc, e o que o terminal decide entregar às funções por cima dessa tabela não aparece no listado. E é aqui que a nota honesta cabe: os nomes das funções vêm dos manuais, mas nem toda a função tem a mesma tecla em todos os modos. O modo emacs é o referencial destas secções. Em modo vi as funções são as mesmas e as teclas mudam — o manual nota que o insert-comment está ligado a M-# em modo emacs e a # em modo de comando vi. As funções sem tecla aparecem no listado com a marca is not bound to any keys — é a linha do kill-region no exemplo — e o bind -p é a base para as re-ligares num ficheiro de inicialização próprio.
Em Resumo
A tabela junta os atalhos do artigo: o que faz cada um e a ocasião de turno que mais o justifica. O bind -P confirma depois o que os teus sistemas activaram de verdade.
| Atalho | O que faz | Quando usar |
|---|---|---|
| Ctrl+R | pesquisa o histórico para trás, incrementalmente | reencontrar journalctl, ssh e comandos dos dias anteriores |
| sudo !! | repete o comando anterior com root | instalações e escritas que arrancaram sem sudo |
| Alt+. | insere o último argumento do comando anterior | caminhos de logs e hosts de ssh/scp repetidos |
| cd – | volta à directoria anterior ($OLDPWD) | alternância entre /etc e /var/log nas manutenções |
| Ctrl+A / Ctrl+E | início e fim da linha | acertar flags em systemctl compridos |
| Alt+# | comenta a linha e guarda-a no histórico | estacionar um comando interrompido |
| sudo tee -a | escreve no ficheiro já como root | sysctl.d, limits.conf e configs de serviços |
| {a,b,c} | gera variantes com prefixo e sufixo comuns | mkdir de estruturas e cópias .bak |
| Ctrl+U / Ctrl+Y | corta e cola a linha (kill-ring) | limpar a linha antes de Enter e reusá-la |
| Ctrl+Z + fg | suspende e retoma o job | editor, logs e systemctl na mesma sessão |
| alias | substitui a primeira palavra por uma curta | status, logs e ssh de todos os dias |
| bind -P | lista as funções e ligações activas | descobrir o que o teu bash tem de verdade |
Fontes Oficiais
- GNU Bash Reference Manual — índice — o manual completo que dá nome às funções Readline, às expansões e ao job control.
- Bash Reference Manual — Commands For History — reverse-search-history (C-r) e as funções de histórico, com o texto exacto de cada uma.
- Bash Reference Manual — Event Designators — os designadores de evento: o !! e o sinónimo !-1.
- Bash Reference Manual — Brace Expansion — o mecanismo, a ordem esquerda-para-a-direita e os exemplos a{d,c,b}e e mkdir.
- Bash Reference Manual — Job Control Basics — o carácter de suspensão C-z, o fg e o jobs — a base do job control.
- bash(1) — man page (man7.org) — a man page do bash: Readline, Event Designators, Expansion, Redirection e os builtins cd, bind, alias e fg.
- tee(1) — man page (man7.org) — o utilitário tee e a opção -a do anexo em vez de sobrescrever.
- GNU Readline — manual — o manual do Readline: insert-comment (M-#), comment-begin e as funções de edição de linha.