Ao digitar um comando no terminal, você também já deve ter feito uso da facilidade de teclar o
TAB para que o Bash completasse o comando, ou argumento para você. Essa função é uma mão na roda.
Bash Completion
O Bash é um dos mais populares Shell do mundo
GNU/Linux, e por isso, meu exemplo será feito com base em seus conceitos.
Este ambiente é preparado pelo script
/etc/bash_completion. Este script prepara o
completion com uma série de comandos pré-configurados.
Uma forma de fazer com que o
bash_completion configure os comandos criados por você, é criando um script no diretório
/etc/bash_completion.d/ em um padrão definido.
Exemplo: Digamos que você criou um comando chamado
ola, que possui as seguintes opções:
- --help
- --message
- --version
O
completion do seu comando, seria algo assim:
_ola() {
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--help --message --version"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _ola ola
Entendendo o código da função
Na linha 2, a função define três variáveis:
- cur → Atual palavra digitada;
- prev → Palavra anterior digitada;
- opts → Opções disponíveis para o comando.
Na linha 8, verifica se o usuário digitou ' - ', e mais qualquer outro texto. Caso sim, a função 'compgen' compara o texto informado com as opções(opts):
compgen -W "${opts}" -- ${cur}
Setando o resultado das opções que correspondem com o texto informado na variável "$COMPREPLY":
Linha 9.
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
Entendendo um pouco mais sobre as variáveis especiais do Bash usadas nessa função:
- COMPREPLY → Um array, de onde o bash lê possíveis sugestões de completions;
- COMP_WORDS → Um array de palavras digitadas na linha de comando atual;
- COMP_CWORD → É o índice que aponta para a palavra atual do array COMP_WORDS.
No final, é feita a associação da função "_ola" com o seu script
ola, através do comando:
complete -F _ola ola.
Este comando registra o
completion do seu comando no ambiente do Bash.
Não encontrei muitas referências completas, mas achei essa bem simples e fácil de entender: