3

Мне нужно, чтобы имена каталогов в /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 ответа2

3

Мой коллега придумал это решение сразу после того, как я опубликовал вопрос. Это работает хорошо:

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
1

Я протестировал решение с HOME-папками (на моем хосте нет почтальона). Это то, что вы ищите?

function _homes() {
    local homes=("/home/$2"*)
    [[ -e ${homes[0]} ]] && COMPREPLY=( "${homes[@]##*/}" )
}
complete -F _homes homes
alias homes='echo you selected:'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .