bash complete: liste les noms de répertoires à partir d'un répertoire défini?

3

J'ai besoin que les noms de répertoires dans / mailman / lists soient complétés par des tabulations en tant qu'argument (sans barres obliques) à la commande 'list_members', quel que soit l'endroit où je me trouve dans le système de fichiers.

Dans tcsh (sur notre ancien serveur), j'ai écrit une ligne pour faire ce dont j'avais besoin:

complete list_members 'p,*,F:/mailman/lists,,' #tcsh

L'implémentation de bash semble être plus complexe. Comment puis-je implémenter ce même comportement en utilisant bash?

La complétion par des tabulations doit être contextuelle pour que la partie de l'argument que j'ai déjà saisie affine la recherche, tout comme la complétion standard en bash. Exemple:

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

J'ai essayé quelques solutions après avoir examiné des exemples, mais elles ne fonctionnent pas correctement.

Un exemple d'échec:

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

complete -F _listlists list_members

Ce qui donne l'erreur:

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

Un autre exemple d'échec:

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

complete -F _listlists list_members

Cela montre tous les résultats de ce répertoire dirigé vers «plus», mais il ne répond pas à l'argument partiel que j'ai déjà saisi.

Merci.

zénatom
la source

Réponses:

3

Mon collègue a proposé cette solution juste après que j'ai posté la question. Ça marche bien:

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
zénatom
la source
1
Comment puis-je gérer les noms de fichiers contenant des espaces?
Tony Barganski
2

J'ai testé une solution avec les dossiers HOME (pas de mailman sur mon hôte). Est-ce ce que vous recherchez?

function _homes() {
    local homes=("/home/$2"*)
    [[ -e ${homes[0]} ]] && COMPREPLY=( "${homes[@]##*/}" )
}
complete -F _homes homes
alias homes='echo you selected:'
retour42
la source
Merci, retour42. Je suis désolé de ne pas avoir pu tester votre solution.
Zenatom
Cette solution fonctionnait mieux pour moi lorsque ce que je complétais était effectivement équivalent à ls.
Colin Dean le