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

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

copytomachine <Machine> <File> 

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

  • усечение имен файлов
  • Как разбить массив в наборе из пяти файлов и загрузить их параллельно?
  • Переменные среды установки OS X
  • Конкретная строка зависает [, [[
  • Как предотвратить ввод команд через параметры команды?
  • Как сгладить журналы для списка шаблонов и сделать из него отчет?
  •  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?

  • Как избежать повесить вкладку в домашней папке?
  • В каких случаях команда, которую вы вводили, теряется из истории?
  • Инициализация локальной переменной Bash
  • Что означает символ «-» в Linux?
  • Работа Cron не работает
  • Подавление "sudo: извините, для запуска sudo требуется пароль"
  • 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 - лучшая ОС в мире.