bash complete: Verzeichnisnamen aus einem definierten Verzeichnis auflisten?

934
zenatom

Ich brauche die Verzeichnisnamen in / mailman / lists, um als Argument (ohne Schrägstriche) an den Befehl 'list_members' zu übergeben, unabhängig davon, wo ich mich im Dateisystem befinde.

In tcsh (auf unserem alten Server) schrieb ich eine Zeile, um das zu tun, was ich brauchte:

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

bashs Implementierung scheint komplexer zu sein. Wie kann ich dieses Verhalten mit bash implementieren?

Die Tab-Vervollständigung muss kontextsensitiv sein, damit der Teil des Arguments, das ich bereits eingegeben habe, die Suche einschränkt, genau wie die Standard-Bash-Vervollständigung. Beispiel:

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

Ich habe ein paar Lösungen ausprobiert, nachdem ich Beispiele angeschaut hatte, aber sie funktionieren nicht richtig.

Ein fehlerhaftes Beispiel:

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

Was ergibt den Fehler:

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

Ein anderes fehlerhaftes Beispiel:

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

Dies zeigt alle Ergebnisse dieses Verzeichnisses an "more", reagiert jedoch nicht auf das teilweise eingegebene Argument, das ich bereits eingegeben habe.

Vielen Dank.

3

2 Antworten auf die Frage

2
zenatom

Mein Kollege hat diese Lösung direkt nach der Veröffentlichung der Frage gefunden. Es läuft gut:

function _listlists() { local cur COMPREPLY=() cur=$ COMPREPLY=($( compgen -W "$(ls -d /mailman/lists/*/|cut -d "/" -f 4)" -- $cur ) ) }  complete -F _listlists list_members 
Wie kann ich Dateinamen unterstützen, die Leerzeichen enthalten? Tony Barganski vor 6 Jahren 0
1
return42

Ich habe eine Lösung mit den HOME-Ordnern getestet (kein Mailman auf meinem Host). Suchst du danach?

function _homes() { local homes=("/home/$2"*) [[ -e $ ]] && COMPREPLY=( "$" ) } complete -F _homes homes alias homes='echo you selected:' 
Danke, Rückkehr42. Es tut mir leid, dass ich Ihre Lösung nicht getestet habe. zenatom vor 9 Jahren 0