bash complete: перечислить имена каталогов из определенного каталога?

796
zenatom

Мне нужно, чтобы имена каталогов в / 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», но не отвечает на частичный аргумент, который я уже набрал.

Благодарю.

3

2 ответа на вопрос

2
zenatom

My colleague came up with this solution right after I posted the question. It works well:

function _listlists() { local cur COMPREPLY=() cur=$ COMPREPLY=($( compgen -W "$(ls -d /mailman/lists/*/|cut -d "/" -f 4)" -- $cur ) ) } complete -F _listlists list_members 
Как я могу поддерживать имена файлов, содержащие пробелы? Tony Barganski 5 лет назад 0
1
return42

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

function _homes() { local homes=("/home/$2"*) [[ -e $ ]] && COMPREPLY=( "$" ) } complete -F _homes homes alias homes='echo you selected:' 
Спасибо, вернись42. Мне жаль, что я не смог проверить ваше решение. zenatom 9 лет назад 0