[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Fw:[OT] [Dicas-L] Extendendo a funcao de completar (comandos, nomes de arquivo etc) na bash



Acabei de receber o seguinte e-mail e estou repassando a lista.
--------------------------------------------------------------------
Endereço: http://www.Dicas-L.unicamp.br/dicas-l/20031120.shtml
--------------------------------------------------------------------
          2ª Semana de Desenvolvimento em Software Livre
                  Unicamp - Campinas - São Paulo
                      9 a 12 de dezembro
   Informações e Inscrições: http://rau-tu.ccuec.unicamp.br/sdsl
----------------------------------------------------------------------

  Extendendo a funcao de completar (comandos, nomes de arquivo etc) na bash
  =========================================================================

Colaboração: Rodrigo Bernardo Pimentel

A grande maioria de usuários de bash (o que, recentemente, significa
a grande maioria de usuários de Linux) está acostumada a apertar TAB para
completar nomes de comandos, nomes de arquivos etc. Por padrão, na bash, o
TAB está associado à função "complete", da biblioteca "readline"
(responsável, entre outras, pelo "bip" e combinações como alt-f, ctrl-u
etc).

O comportamento padrão do "complete", em linhas gerais, é tentar
completar com um nome de comando, caso se esteja tentando completar a
primeira palavra da linha (por comando entende-se qualquer arquivo
executável nos diretórios especificados pela variável $PATH), ou por um
subdiretório do diretório atual, caso não haja comando adequado; ou com
nomes de arquivos a partir do diretório atual (a não ser que comece com /).

Este comportamento simples é útil, mas certamente poderia ser mais
inteligente. Por exemplo, se quero "virar" outro usuário, com o comando su,
seria bom poder usar TAB pra completar com nomes de usuários. Ou, para o
comando ssh, usar TAB para completar com nomes de máquinas conhecidas (no
arquivo ~/.ssh/known_hosts, por exemplo). Ou, ainda, que TAB após o comando
"cd" só tentasse completar com nomes de diretórios, não também de arquivos.

Bem, tudo isso é possível com a função "complete" do bash (a partir
da versão beta 2.04). Note: o que efetivamente completa os nomes é a função
"complete" da biblioteca readline. A função "complete" do bash serve para
customizar o comportamento da função de mesmo nome na readline.

De maneira simplificada, a função "complete" tem a seguinte forma:


  complete -A <acao> <comando>


em que <acao> indica como gerar a lista de possíveis palavras a
completar e <comando> indica para que comando (ou, enfim, início de linha)
completar com aquela regra.

Por exemplo, para o exemplo do "su" acima, poderíamos usar:


  complete -A user su


A maioria das ações têm uma abreviação. No caso de "-A user", posso
usar "-u":


  complete -u su


Como há outros comandos que também só fazem sentido com usuário, eu
posso indicar vários comandos de uma vez:


  complete -u su usermod userdel passwd chage write chfn groups slay


Para o exemplo do "cd", poderíamos usar


  complete -d cd


Para situações mais específicas, ou mais complexas, como pegar nomes
de hosts para o ssh, é possível criar funções de bash para gerar a lista de
palavras com que completar o comando. Com isso, a função "complete" fica
extremamente flexível.

Na Debian, o pacote "bash" (se em uma versão que já suporta
"programmable completion") já instala um arquivo com uma série de
configurações úteis nesse sentido, em /etc/bash_completion . Além disso,
programas diversos podem instalar arquivos específicos em
/etc/bash_completion.d , no melhor estilo Debian de fazer configurações
flexíveis.

Quem não usa Debian (não sei se outras distribuições incluem este
arquivo, mas pelo que entendi algumas têm um pacote separado,
"bash_completion") pode pegar os arquivos de configuração em
http://freshmeat.net/projects/bashcompletion/ .

Na Debian, essas configurações vêm desabilitadas por padrão, por
serem diferentes do normalmente esperado. Para habilitá-las, basta
descomentar (tirar os símbolos de "#") as seguintes linhas em
/etc/bash.bashrc :

  #if [ "$PS1"-a -f /etc/bash_completion ]; then
  #    . /etc/bash_completion
  #fi

Ou, para habilitá-las somente para o seu usuário, coloque em seu
~/.bashrc :

  if [ "$PS1"-a -f /etc/bash_completion ]; then
  . /etc/bash_completion
  fi

Esse arquivo inclui "~/.bash_completion", então você pode colocar
customizações lá, se quiser.

Para mais informações, dê uma olhada em /etc/bash_completion e leia
"man bash", seções "programmable completion" e "completing" e a descrição da
função "complete".

--------------------------------------------------------------------

Unix Comandos de Usuários - Guia de Consulta Rápida
http://novateceditora.com.br/guias/unixcomandos/
--------------------------------------------------------------------
As mensagens da lista Dicas-L são veiculadas diariamente
para 23107 assinantes.

       Todas as mensagens da Dicas-L ficam armazenadas em
               http://www.Dicas-L.unicamp.br.

A redistribuição desta e outras mensagens da lista Dicas-L pode
ser feita livremente, deste que o conteúdo, inclusive esta nota,
não sejam modificados.
---------------------------------------------------------------



Reply to: