você está aqui: Home  → Arquivo de Mensagens

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".



 

 

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

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script