você está aqui: Home  → Arquivo de Mensagens Programe sua mente para aprender inglês - ebook gratuito

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   

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.



Veja a relação completa dos artigos de Rodrigo Bernardo Pimentel