bash complete: перечислить имена каталогов из определенного каталога?
Мне нужно, чтобы имена каталогов в / mailman / lists были добавлены в качестве аргумента (без косой черты) в команду 'list_members' независимо от того, где я нахожусь в файловой системе.
В tcsh (на нашем старом сервере) я написал одну строку, чтобы сделать то, что мне нужно:
complete list_members 'p,*,F:/mailman/lists,,' #tcsh
Реализация bash кажется более сложной. Как я могу реализовать это же поведение с помощью Bash?
Завершение табуляции должно быть контекстно-зависимым, чтобы любая часть введенного мной аргумента сужала поиск, как и стандартное завершение bash. Пример:
list_members sys<TAB> #only shows names beginning with sys
Я попробовал несколько решений после просмотра примеров, но они не работают должным образом.
Один неудачный пример:
function _listlists()
{
COMPREPLY=( $( compgen -C 'ls /mailman/lists' ) )
}
complete -F _listlists list_members
Что приводит к ошибке:
-bash: compgen: warning: -C option may not work as you expect
Еще один неудачный пример:
function _listlists()
{
cd /mailman/lists
COMPREPLY=( $( compgen -d ) )
cd -
}
complete -F _listlists list_members
Это показывает все результаты этого dir, переданные по каналу "more", но не отвечает на частичный аргумент, который я уже набрал.
Благодарю.
2 ответа
Мой коллега придумал это решение сразу после того, как я опубликовал вопрос. Это работает хорошо:
function _listlists()
{
local cur
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($( compgen -W "$(ls -d /mailman/lists/*/|cut -d "/" -f 4)" -- $cur ) )
}
complete -F _listlists list_members
Я протестировал решение с помощью HOME-папок (на моем хосте нет почтальона). Это то, что вы ищите?
function _homes() {
local homes=("/home/$2"*)
[[ -e ${homes[0]} ]] && COMPREPLY=( "${homes[@]##*/}" )
}
complete -F _homes homes
alias homes='echo you selected:'