Aqui está uma função rudimentar que eu acho que pode servir como ponto de partida. Pode falhar de várias maneiras, esperamos que outras pessoas aqui possam melhorar:
completions () (
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
IFS="$COMP_WORDBREAKS" read -a words <<<"$1"
complete_setting=($(complete -p "${words[0]}"))
complete_optstring=":abcdefgjksuvprDEo:A:G:W:F:C:X:P:S:"
while getopts "$complete_optstring" option "${complete_setting[@]:1}"
do
case $option in
F) complete_functon="$OPTARG"
;;
*) # Run around screaming!
;;
esac
done
COMP_WORDS=("${words[@]}")
COMP_LINE="$1"
COMP_POINT="${#COMP_LINE}"
COMP_CWORD=$((${#COMP_WORDS[@]} - 1))
"$complete_functon"
printf "%s\n" "${COMPREPLY[@]}"
)
Notas:
- Se você estiver usando isso como uma função para o seu shell interativo, a fonte inicial não é necessária.
-
complete
procura palavras divididas usandoCOMP_WORDBREAKS
, por isso, definimosIFS
comoread
. -
complete -p
imprime a configuração de conclusão atual de forma reutilizável, para que possamos analisar as opções da maneira que o faria. - A função usa um subshell (
()
em vez de{}
), portanto, seu ambiente atual não deve ser perturbado.