Uma conclusão 1 bastante ruim para o Bash:
function _ssh_complete () {
local match=${COMP_WORDS[${COMP_CWORD}]}
local hosts=
local default=
local _ssh_complete_hostlist=$( \
grep "^\s*Host\s*=" ~/.ssh/config 2>/dev/null \
| sed -r "s/^[^=]+= *//;s/ /\n/g" \
| sort )
for h in $_ssh_complete_hostlist; do
if [[ $h =~ ^$match ]]; then
hosts="$hosts $h"
fi
done
if ! (( ${COMP_CWORD} == ${#COMP_WORDS[@]}-1 )); then
default=$( compgen -f ${COMP_WORDS[${COMP_CWORD}]} )
fi
COMPREPLY=($hosts $default)
}
complete -F _ssh_complete ssh
Você provavelmente desejará inicializar $_ssh_complete_hostlist
fora da função de conclusão (por exemplo, durante o init de shell), caso contrário, você estará gerando três programas por teste de conclusão. O arquivo de configuração não muda tão frequentemente que seria necessário, e você sempre pode chamar a função de inicialização manualmente quando necessário.
1) por exemplo, ele só é completado no final da linha, então você tem que declarar as opções primeiro e somente então começar a digitar e completar o nome do host remoto.