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

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

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

  • Как сохранить последнюю команду в файл?
  • Как изменить вывод команды времени?
  • Установка переменных readline в оболочке
  • Alt-Left для пропуска слов не работает в эмуляторах терминалов
  • Создать переменную на основе порядка, в котором файл находится в алфавитном списке файлов
  • Как я могу запустить программу из bash, игнорируя ее stdout, чтобы я мог запускать больше программ?
  • 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 } 

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

  • Ошибка скрипта, но копирование и вставка из скриптов
  • cp: не может статировать ошибку - когда имя файла имеет азиатские символы
  • bashscript для нажатия клавиши со стрелкой вправо
  • mv: не обнаружено, когда выполняется из сценария, который изменяет переменную PATH
  • Ошибка выхода из сценария из командной подстановки
  • Измените значения $ READLINE_LINE и $ READLINE_POINT внутри сценария 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 - лучшая ОС в мире.