Isso pode funcionar:
_vlink () {
case $COMP_CWORD in
1) COMPREPLY=( $(compgen -W "plug unplug replug" "$2") ) ;;
2) local IFS=$'\n'
COMPREPLY=( $(cd /some/dir && compgen -d "$2") ) ;;
esac
}
complete -F _vlink vlink
Substitua /some/dir
pelo diretório que contém os subdiretórios de interesse. (Estou supondo que seus nomes de diretório não tenham novas linhas neles.)
-
COMP_CWORD
é o índice da palavra que está sendo concluída (0 sendo o nome do comando) - o segundo argumento para a função de conclusão é a palavra que está sendo concluída (o primeiro é o nome do comando e o terceiro é a palavra anterior)
Então, usamos compgen
:
- para o primeiro argumento, para gerar palavras correspondentes na lista de palavras fornecidas com
-W
e - para o segundo argumento, para gerar nomes de diretórios correspondentes do diretório relevante.