[F]or the sake of elegance and portability, I seek to provide the autocomplete inside the script itself.
Você não pode fazer isso dentro do script de shell.
Tradicionalmente, a conclusão de bash para scripts e binários é tratada por entradas em diretórios designados (por exemplo, /etc/bash_completion.d
e /usr/share/bash-completion/completions
para Bash).
No entanto, tudo isso é chamado de comando interno complete
com parâmetros apropriados. Ao chamar seu script pela primeira vez, você pode simplesmente criar uma entrada em um desses diretórios (requer privilégios de root) ou em ~/.bashrc
.
A sintaxe básica é a seguinte:
# declare function to pass to 'complete'
_myscript()
{
# declare variable 'cur' (holds string to complete) as local
local cur
# initialize completion (abort on fail)
_init_completion || return
# if string to complete ('cur') begins with '-' (option)
if [[ "$cur" == -* ]] ; then
# complete to the following strings, if they start with 'cur'
COMPREPLY=( $( compgen -W '-a -b -c --foo --bar' -- "$cur" ) )
else
# otherwise, complete to elements in current directory that begin with 'cur'
_filedir -d
fi
# if declaring the function was successful, use it when the command is 'myscript'
} && complete -F _myscript myscript
Por exemplo, você pode salvar o acima em ~/.myscript_completion
e anexar
source ~/.myscript_completion
para ~/.bashrc
.