Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
Extendendo a funcao de completar (comandos, nomes de arquivo etc) na bash
Colaboração: Rodrigo Bernardo Pimentel
Data de Publicação: 20 de Novembro de 2003
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".
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.





