Завершение 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?

Поскольку 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 не дает совпадений.