Terminal: Repetindo o último argumento do comando anterior, usando o bang-dollar

Augusto Campos em 24/08/2012

O !$ ou bang-dollar é um daqueles atalhos que ajudam a economizar quilômetros de digitação.

A sintaxe comum a boa parte dos comandos que são executados no Terminal faz com que seja frequente encontrar situações em que o último argumento do comando anterior seja repetido no próximo comando, como nos exemplos a seguir:

ls -l sistema-3.8.2-pre
tar zcvf sistema-3.8.2-pre.tar.gz sistema-3.8.2-pre
mkdir projeto
cd projeto
cp example.conf wordpress.conf
nano -w wordpress.conf
ping -c1 servidor.com.br
ssh fulano@servidor.com.br

Trata-se de uma situação tão comum, que mereceu inúmeros atalhos e formas alternativas de ter de evitar a redigitação. Para quem já aprendeu, na semana passada, a usar o bang bang (!! ou dupla exclamação) para repetir um comando inteiro como argumento do próximo, provavelmente a alternativa mais simples de memorizar será o !$ (que, pela tradição tipográfica dos EUA, recebe o título de bang dollar).

O funcionamento do bang dollar é fácil de entender, pois simplesmente executa o novo comando substituindo o !$ pelo último parâmetro do comando anterior (mostrando antes, numa linha à parte, como ficou o comando após a substituição). Repetindo os exemplos acima:

ls -l sistema-3.8.2-pre
tar zcvf !$.tar.gz !$
mkdir projeto
cd !$
cp example.conf wordpress.conf
nano -w !$
ping -c1 servidor.com.br
ssh fulano@!$

Se você quiser ver o resultado da substituição antes de confirmar o novo comando, pressione ESC Control+E (ou seja, primeiro a tecla ESC separadamente, depois Control e E ao mesmo tempo).

Uma alternativa um pouco diferente no mecanismo, mas que nos casos comuns tem o mesmo efeito (exceto pela ausência de impressão do comando expandido antes de executá-lo), é usar a variável no lugar da expansão !$.

Ao invés de inserir uma expansão ou variável, você também pode inserir na posição do cursor o último parâmetro do comando anterior usando um atalho de teclado. O ESC. (ou seja, a tecla ESC seguida de um ponto) é um deles, e funciona na configuração default do Mac.

E já que você está memorizando expansões baseadas no ponto de exclamação, aqui vão mais duas:

  • !* expande para o conjunto completo de parâmetros do comando anterior
  • !:n (onde n é um número) expande para o n-ésimo parâmetro do comando anterior. Por exemplo, !:3 é o terceiro parâmetro, !:5 é o quinto parâmetro, e assim por diante

Estes são apenas exemplos simples da expansão de parâmetros do shell Bash (default do Terminal do OS X) e de outros que adotam as mesmas convenções, mas também estão entre os mais úteis no dia-a-dia, e podem poupar bastante digitação. Aproveite!

(PS: Certamente voltaremos ao assunto dos atalhos do Terminal, mas se você quiser ir se adiantando, a documentação do Bash tem bastante informação interessante e atualizada sobre maneiras de economizar tempo e digitação ツ)

Comentar

Comentários arquivados

Comentário de Ronan em 24/08/2012 às 10:27:51

Augusto, Muito obrigado pelos dois posts de terminal, que uso bastante mas nao conhecia esse uso dos parâmetros!! Muito bom!

Comentário de Bruno Gama em 24/08/2012 às 11:20:01

screencast do peepcode sobre CLI é fantástico, recomendo.

Comentário de Everton Ribeiro em 24/08/2012 às 19:01:49

Muito bom, não conhecia nenhum dos citados aqui, e gostei muito da dica do bang bang no ultimo post. Dois que utilizo muito: Comando de substituição: ^[termo_a_substituir]^[termo_de_substituicao]^ Comando de historico: ![n] # onde n é o numero do comando, que pode ser recuperando com o comando history. Outra dica, no zsh (um shell muito bom que todos deveriam dar uma olhada) se vc quiser ver um preview de como fica a substituição para qualquer um desses comando, basta dar um espaço depois de digitar, ele já mostra como fica ai é só da o enter.

Comentário de Bruno Gama em 24/08/2012 às 21:44:16

outra dica é instalar o fantástico "framework" oh-my-zsh

Comentário de Bruno Gama em 24/08/2012 às 21:48:29

o bang-bang é a segunda ou terceira coisa que eu mais digito no terminal a primeira é o comando j (autojump) recomendo a todos instalarem. "autojump is a faster way to navigate your filesystem. It works by maintaining a database of the directories you use the most from the command line. The jumpstat command shows you the current contents of the database. You need to work a little bit before the database becomes usable. Once your database is reasonably complete, you can “jump” to a commonly "cd"ed directory by typing:" src: https://github.com/joelthelion/autojump/wiki mas está disponível pelo homebrew