bash complete: lista os nomes de diretório de um diretório definido?

3

Eu preciso dos nomes de diretório em / mailman / lists para concluir a tabulação como um argumento (sem barras) no comando 'list_members', independentemente de onde eu esteja no sistema de arquivos.

No tcsh (no nosso servidor antigo), escrevi uma linha para fazer o que precisava:

complete list_members 'p,*,F:/mailman/lists,,' #tcsh
A implementação do

bash parece ser mais complexa. Como posso implementar esse mesmo comportamento usando o bash?

A conclusão da tabulação precisa ser sensível ao contexto para que qualquer parte do argumento que eu já tenha digitado reduza a pesquisa, assim como a conclusão padrão do bash. Exemplo:

list_members sys<TAB> #only shows names beginning with sys

Eu tentei algumas soluções depois de ver exemplos, mas elas não funcionam corretamente.

Um exemplo com falha:

function _listlists()
{
    COMPREPLY=( $( compgen -C 'ls /mailman/lists' ) )
}

complete -F _listlists list_members

Qual produz o erro:

-bash: compgen: warning: -C option may not work as you expect

Outro exemplo falho:

function _listlists()
{
    cd /mailman/lists
    COMPREPLY=( $( compgen -d ) )
    cd -
}

complete -F _listlists list_members

Isso mostra todos os resultados desse diretório canalizados para 'more', mas não responde ao argumento parcial que eu já digitei.

Obrigado.

    
por zenatom 05.02.2015 / 22:52

2 respostas

2

Meu colega criou essa solução logo depois que eu postei a pergunta. Isso funciona bem:

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
    
por 13.03.2015 / 23:49
1

Eu testei uma solução com as pastas HOME (sem mailman no meu host). É isso que você está procurando?

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