você está aqui: Home  → Arquivo de Mensagens

Aliases - aprofundando um pouco

Colaboração: Márcio C. M. Rezende

Data de Publicação: 31 de julho de 2013

Depois de ver a dica do dia 22 e, como uso alguns aliases para facilidar minha vida, decidi aprofundar um pouco e postar o resultado aqui.

Aliases podem nos economizar o trabalho de ficar guardando um monte de scripts simples, conhecidos como one-liners, num diretório. Para que fiquem mais interessantes poderiam, a grosso modo, ser comparados com "Closures". Para os não iniciados, isto se resumiria como um esquema de programação que usa funções que retornam funções.

Estas funções são ótimas para se trabalhar com listas, coleções, tabelas, etc e comumente usadas nas poderosas técnicas do paradigma programação funcional, onde se usam funções lambdas, funções de ordem superior, etc. São, portanto, de amplo conhecimento de programadores Lisp, Python, Scheme, Ruby e outras. Adianto que não sou versado em nenhuma delas mas estou cada vez mais interessado, principalmente em Python e peço que os programadores, versados, não se ofendam com a comparação. (No flames please)

Enfim esta introdução foi para dizer que dá para aprofundar um pouco mais nos aliases e torná-los peças "colecionáveis". A minha coleção fica no meu .bash_aliases, como sugerido na dica do Rubens, do dia 22.

Os dois maiores problemas que enfrentei foram:

  • Usar argumentos
  • "Cotar" argumentos

Explico: quando temos arquivos com espaços nos nomes (IMHO, uma herança maldita de hábitos ruins de usuários oriundos de outros sistemas operacionais) passamos a criar quebras. Cotar estes argumentos é sempre uma fonte de dor de cabeça em bash, principalmente com o comando find.

Concluindo, sem me estender mais, aqui vai um alias que criei usando a técnia de embutir uma função e passar um argumento, que aceita os "malditos espaços".

# Este alias remove todos os arquivos de backup (foo~) do emacs e temporários perdidos (#bar#) que ficam esquecidos pelo caminho durante uma sessão "intensa" de programação (:-)

  alias crush='function _crush(){ find $@ -type f -and -name '"'"'*~'"'"' -or -type f -and -name '"'"'#*'"'"' -exec rm -i \{\} \;;}; _crush'

Note que:

  • a função _crush, que "faz o serviço" é criada e chamada logo em seguida à sua definição e usa os argumentos da linha de comandos via "$@"

  • os argumentos devem ser encapsulados nesta série "estranha" de aspas e que faz o seguinte
      '"'"'
      +||||---> fecha a sequencia anterior, aberta no inicio (logo após o `=')
      +|||---> abre uma nova string de um caractere (aspas simples)
       +||---> literalmete uma aspa simples cotadas ("'")
        +|---> fecha a aspa cotada
         +---> abre uma nova string que se fechará com a próxima aspa simples
    


Veja a relação completa dos artigos de Márcio C. M. Rezende