bash completion: как заполнить список хостов для определенного аргумента?

Моя программа может иметь следующий формат:

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

Я пытаюсь установить автоматическое завершение bash и основываясь на статье администрирования debian , я сделал завершение хоста следующим образом:

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

Конечно, после написания -hosts bash может завершить имя одного хоста, но не нескольких хостов. Есть ли прекрасный способ добиться этого взлома без завершения хостов, когда мы имеем дело с другими аргументами, чем -hosts ?

Если вы проигнорируете случай (<more_arguments>) вы можете просто проверить, является ли -hosts одним из ранних слов:

 (...) 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 

Я не уверен, возможно ли создать такое правило автозаполнения для пространственно разделенных значений узлов. Но если вы не возражаете использовать списки, разделенные запятыми, тогда:

 _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