bash completion: como completar uma lista de hosts para um argumento específico?

1

Meu programa pode ter o seguinte formato:

<command_name> <arguments> <options> -hosts <host1> <host2> ... <hostn> (<more_arguments>) ...

Estou tentando definir o autocompletar bash e com base no artigo debian-administration , Eu fiz a conclusão do host assim:

(...)
case "${prev}" in
    -hosts)
        _known_hosts_real -a "$cur"
        return 0
        ;;
    (...)
(...)

Claro que depois de escrever -hosts bash é capaz de completar o nome de um único host, mas não de múltiplos hosts. Existe uma maneira bonita de conseguir esse truque sem completar hosts quando lidamos com outros argumentos além de -hosts ?

    
por denaitre 19.11.2014 / 18:12

2 respostas

0

Se você ignorar o caso (<more_arguments>) , poderá verificar se -hosts é uma das palavras anteriores:

(...)
for ((i=1;i<COMP_CWORD;i++)); do 
  if [ "-hosts" == "${COMP_WORDS[i]}" ]; then 
    _known_hosts_real -a "$cur" 
    return 0 
  fi 
done 
case "${prev}" in 
    
por 19.11.2014 / 19:41
0

Não tenho certeza se é possível criar essa regra de autocompletar para valores de hosts separados por espaço. Mas se você não se importa em usar listas separadas por vírgulas, então:

_myhost () {
  local cur prev opts
  _get_comp_words_by_ref cur prev

  opts='-hosts'
  servers='name1 name2 name3'

  if [[ ${cur} == -* ]] ; then
    COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
  else
    case "${prev}" in
      -hosts)
        if [[ "$cur" == *,* ]]; then
          local realcur prefix
          realcur=${cur##*,}
          prefix=${cur%,*}
          COMPREPLY=( $(compgen -W "${servers}" -P "${prefix}," -- ${realcur}) )
        else
          COMPREPLY=( $(compgen -W "${servers}" -- ${cur}) )
        fi
        ;;
      *)
        # do nothing
        ;;
    esac
  fi
}
complete -F _myhost myhost
    
por 29.12.2014 / 17:17