завершение bash файлов с полным путем

#bash #bash-completion

#bash #bash-завершение

Вопрос:

Я создал следующую функцию завершения bash:

 _scpinst ()
{
    local cur prev opts;
    COMPREPLY=();
    cur="${COMP_WORDS[COMP_CWORD]}";
    prev="${COMP_WORDS[COMP_CWORD-1]}";
    opts="-l";
    if [[ ${prev} == '-l' ]]; then
            files=$(ls /upgrade/*.tgz.gpg 2>/dev/null);
            COMPREPLY=($(compgen -W "${files}" -- ${cur}));
            compopt -o nospace
            return 0;
    fi;
    COMPREPLY=($(compgen -W "${opts}" -- ${cur}));
    return 0
}

complete -F _scpinst scpinst
  

Он автоматически завершает * .tgz.gpg файлы в каталоге /upgrade после флага -l.
Есть ли лучший способ выполнить это без использования команды ‘ls’. Например. используя имена файлов -o или -f?

Ответ №1:

Просто используйте -G globpat опцию compgen:

 COMPREPLY=($(compgen -G "/upgrade/*.tgz.gpg" -- ${cur}));
  

Если по какой-то причине вы хотите использовать именно -W wordlist (например, для смешивания имен файлов с чем-то другим), это также возможно:

 files=(/upgrade/*.tgz.gpg)
COMPREPLY=($(compgen -W '"${files[@]}"' -- ${cur}));
  

Обе версии должны правильно обрабатывать имена файлов, содержащие пробелы (в то время как ваш вариант этого не сделает).

Комментарии:

1. ОК. 2-й работает хорошо. Первый действует странно. он хорошо завершает имена файлов, но когда я набираю другой символ для выбора из файлов и нажимаю TAB, он удаляет добавленный символ.