Páginas

quarta-feira, 31 de agosto de 2011

Auto-completar Bash usando chaves { }

Bem, se você usa o terminal mesmo que pouco deve saber que a tecla TAB é usada para auto-completar nomes de arquivos e alguns comandos.

Mas o que você não deve saber é do uso das chaves como forma de construir strings arbitrárias. E mais, se você é como o meu amigo Flávio Amieiro e já sabia disso, aposto que você não sabia que pode usar auto-completar e as chaves {} {} {} {}!!!!

Digamos que estou num diretório assim:


rodolfo@lisa:/tmp/bash-tricks$ ls
foo_ball.egg  foobaz         foo_spam2.egg  foo_spam.egg  hello.c
foo-bar       foo_spam1.egg  foo_spam3.egg  foo.txt

Podemos auto-completar nomes com TAB. Por exemplo, digitar "h" seguido de TAB vai resultar em "hello.c".

Digamos que quero fazer um diff entre foo_spam2.egg e foo_spam3.egg. Uma forma de fazer isso seria digitar o comando completo:

diff foo_spam2.egg foo_spam3.egg


Depois de ler isto aqui, espero que sua forma de fazer seja assim:

diff foo_spam{2,3}.egg

O Bash expande automaticamente tudo que estiver dentro das chaves. Itens são separados por vírgula, sem espaços. Se quiser colocar um espaço ou vírgula na string gerada, escape com uma contra-barra \.

Exemplo:

rodolfo@lisa:/tmp/bash-tricks$ echo O Bash é {legal\,,muito\ poderoso,e\ divertido.}
O Bash é legal, muito poderoso e divertido.

Agora a cereja no topo do bolo! Como gerar uma string como a do exemplo acima a partir dos arquivos num diretório?

Digamos que queremos remover todos os arquivos que começam com "foo".
Começamos digitando:

rodolfo@lisa:/tmp/bash-tricks$ rm f

Agora tecle alt + { e você verá o Bash auto-completar usando a notação de {}:

rodolfo@lisa:/tmp/bash-tricks$ rm foo{-bar,.txt,_{ball.egg,spam{.egg,1.egg,2.egg,3.egg}},baz} 

Fantástico não? Note que você pode apontar para outros diretórios, e fazer combinações arbitrariamente complexas.
Não sei em que parte da documentação isto está, descobri por acaso!

Quer aprender mais? man bash

6 comentários:

Denilson Sá disse...

E tem mais! Isso também funciona para um intervalo numérico (com ou sem os zeros à esquerda):

echo example{1..20}.txt
echo example{01..20}.txt

Rodolfo disse...

Puxa vida! Você não vai precisar ler o próximo post sobre Bash... é justamente sobre isso! (fica na mesma seção do man bash)
Resolvi guardar e não soltar tudo num post só e as coisas se perderem.

Obrigado pela visita e o comentário!

rod~ disse...

Olá Rodolfo.
Bash é realmente muito poderoso.
Não entendi esse seu exemplo quando você menciona Alt + {
O que era pra ter acontecido?
Só entendi mesmo da expansão com o diff e com o exemplo postado pelo Denilson. Poderia explicar melhor aquela parte, por favor?
Abraço!

Rodolfo disse...

Adicionei um pouco de texto explicando a última parte. Se não conseguir entender, pode perguntar aqui.
Uma sugestão é experimentar os exemplos num terminal e ver ao vivo o comportamento do Bash.

Obs: Para remover todos os arquivos começados com "foo" ainda é melhor usar rm foo*, mas o alt+{ permite ver o que está no input para o comando, e te dá a flexibilidade de editar antes de executar.

Denilson Sá disse...

Dependendo do terminal usado, Alt+{ vai digitar um caractere acentuado, em vez de chamar o comando do bash.

Mas isso é facilmente resolvido. No linux (ou no terminal, ou no Unix... ah, sei lá onde mais!), Alt+tecla é equivalente a apertar Esc seguido da tecla.

Ou seja, enquanto aqui Alt+{ aparece "û", apertar Esc, e depois apertar { faz o efeito descrito no post.

rod~ disse...

Obrigado Rodolfo e Denilson.
Testei com Esc + { e funcionou perfeitamente.