#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, он удаляет добавленный символ.