De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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
.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários