Завершение Smart Bash В зависимости от позиции «Аргумент»

У меня есть простая функция bash, в основном оболочка вокруг scp. Вызывается с использованием

copytomachine <Machine> <File> 

Я создал несколько простых авто, таких, что когда я печатаю

 copytomachine <TAB><TAB> 

Он представляет мне список доступных машин, просто жестко закодированную последовательность в настоящее время, что отлично подходит для моих нужд.

Если, однако, я напечатаю

 copytomachine BUILD_SERVER <TAB><TAB> 

Я бы хотел, чтобы он предложил мне список файлов в моем каталоге и смог автозаполнять их пути и т. Д. Однако я не хочу, чтобы этот список файлов был представлен мне для первого параметра (имя машины).

Мой текущий скрипт завершения выглядит так:

 _machines_completions() { local opts opts="BUILD_SERVER TEST_SERVER LOCAL_MACHINE" COMPREPLY=( $(compgen -W "${opts}" -- ${COMP_WORDS[COMP_CWORD]}) ) return 0 } 

Может ли кто-нибудь сообщить, как я могу изменить это, чтобы позволить мне заполнить вкладку для этих определенных имен машин для параметра 1 и заполнить вкладку для имен файлов по параметру 2?

  • Умный полный .c и .o
  • Как я могу выполнить вкладку umount, ограничивая тома в определенном каталоге?
  • Объяснение завершения имени файла Bash
  • Автозаполнение правил Makefile в tcsh
  • Как перенести список завершения zsh с фиксированной строкой текста до и после?
  • Автозаполнение от выхода grep
  • FreeBSD csh, TAB, чтобы показать доступные варианты?
  • Как игнорировать PATH с завершением `source`
  • One Solution collect form web for “Завершение Smart Bash В зависимости от позиции «Аргумент»”

    Поскольку COMP_CWORD – это номер слова, вы можете проверить его значение:

     _machines_completions() { local opts opts="BUILD_SERVER TEST_SERVER LOCAL_MACHINE" case $COMP_CWORD in 1) COMPREPLY=( $(compgen -W "${opts}" -- "${COMP_WORDS[COMP_CWORD]}") ) ;; 2) COMPREPLY=( $(compgen -o default -- "${COMP_WORDS[COMP_CWORD]}") ) ;; esac return 0 } 

    -o default :

    Использовать полное имя файла Readline по умолчанию, если compspec не дает совпадений.

    Linux и Unix - лучшая ОС в мире.