Нужна помощь в этом скрипте автозавершения bash

Я пытаюсь настроить autocompletion для команды, которая принимает только один параметр, имя папки,

В /secure/kernel_builds/ , у меня есть три следующие подпапки:

3.5.6/ 3.6.2/ source/

Теперь я хочу автозаполнение, в котором перечислены все имена подпапок, но не тот, который называется source , прямо сейчас я использую довольно глупый способ сделать это, проверяя, запущено ли слово завершения с номером,

 _avail_kernel_builds() { case $COMP_CWORD in 1) if [[ "${COMP_WORDS[COMP_CWORD]}" =~ ^[0-9] ]];then COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"* ) else COMPREPLY=( /secure/kernel_builds/"${COMP_WORDS[COMP_CWORD]}"[0-9]*/ ) fi COMPREPLY=( "${COMPREPLY[@]#/secure/kernel_builds/}" ) COMPREPLY=( "${COMPREPLY[@]%/}" ) ;; esac } 

Есть ли лучший способ сделать это?

2 Solutions collect form web for “Нужна помощь в этом скрипте автозавершения bash”

Для этой compgen встроенный compgen имеет аргумент -X :

 -X filterpat
     filterpat - это шаблон, используемый для расширения имени файла.  Он применяется к списку 
     возможные доработки, сгенерированные предыдущими параметрами и аргументами, и каждый 
     завершение соответствия filterpat удаляется из списка.  Ведущий !  в filterpat 
     отрицает шаблон;  в этом случае любое завершение, не соответствующее filterpat, удаляется.

Поэтому вы могли бы просто сделать что-то вроде:

 _avail_kernel_builds() { case $COMP_CWORD in 1) COMPREPLY=( $(cd /secure/kernel_builds; compgen -d -X "source") ) ;; esac } 

Итак, compgen -d говорит «перечислить папки в текущем каталоге», а « -X "source" говорит» … «но отфильтровывает все, что называется« источник ».

Вы можете проверить цикл для строк, которые вы (не хотите) хотите:

 declare -a accept declare -a reject for s in "${COMPREPLY[@]}"; do if [[ "$s" =~ want ]]; then accept=( "${accept[@]}" "$s" ) else reject=( "${reject[@]}" "$s" ) fi done 
  • Настройте автозаполнение для первого аргумента, оставьте остальных в покое
  • Почему nullglob влияет на завершение вкладок?
  • csh: установка команды для `cd` для отображения как каталогов, так и файлов
  • vi <TAB> завершает только каталоги в bash
  • Как изменить ключ для автозаполнения в ZSH?
  • set -x не печатает информацию о стеке для автозаполнения bash
  • Как добавить все двоичные файлы к завершению вкладки bash для некоторой команды?
  • Завершить остановку вкладки Bash
  • zsh завершение - показать больше параметров, чем просто псевдоним
  • Есть ли обходной путь для удаления файла-файла Debian $ _?
  • Отключить завершение имени файла подстроки в zsh
  • Как я могу указать правильные вкладки tabh для аргументов моего сценария Python
  • Linux и Unix - лучшая ОС в мире.