Нужна помощь в этом скрипте автозавершения 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 } 

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

  • Есть ли обходной путь для удаления файла-файла Debian $ _?
  • Контекстно-зависимое заполнение bash изменяет поведение подстановочных знаков
  • Как расширить имена файлов с помощью Tab, даже если в пути используется переменная оболочки?
  • ZHH имеет две вкладки для заполнения имен файлов
  • автозаполнение с подстановочными знаками для cd в bash
  • opensuse sudo bash дает полные имена путей
  • Автозаполнение флагов после подкоманды
  • Как выполнить завершение командной строки с файлами и папками
  • 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 
    Linux и Unix - лучшая ОС в мире.