Wie lasse ich Bash Autocomplete Wildcards schlagen?

10

Wenn ich ein Verzeichnis habe, das die Dateien enthält

foo.bar.a.cat
foo.bar.a.hat

und ich tippe ls f+ TABdie Bash-Shell wird automatisch vervollständigt ls foo.bar.a.. Wenn ich ls *bar*+ TABeingebe, möchte ich, dass es automatisch vervollständigt wird *bar*.a.. Ist das möglich?

Das sieht der Frage ähnlich

Wie aktiviere ich die Tab-Vervollständigung von Platzhaltern in Bash?

Aber die vorgeschlagene Antwort "es funktioniert sofort für mich" funktioniert nicht. Ich habe es auch versucht TAB TAB, ohne Wirkung. Der Befehl `` bash --version givesGNU bash, Version 4.2.37 (1) -release (x86_64-pc-linux-gnu) `.

Süchtig
quelle

Antworten:

14

Sie wollen entweder:

Insert-Vervollständigungen

ALT* für 'Alle Vervollständigungen einfügen'

Damit würde ein Verzeichnis mit dem Dateinamen 'aa ab ac ad'
ls a*gefolgt von alt + *vervollständigtls aa ab ac ad

Manpage-Eintrag zum Binden:

Insert-Vervollständigungen (M- *)

Fügen Sie alle Vervollständigungen des Textes vor dem Punkt ein, der durch mögliche Vervollständigungen generiert worden wäre.

glob-expand-word

Auf einigen Systemen funktioniert das oben Genannte nicht mit Wildchars. Auf solchen Systemen funktioniert Folgendes für mich:

ctrlx, *(eine Zweitaktkombination)

Beispiel: Ich habe ein Verzeichnis gefüllt mit:

touch {a,b,c,d,e,f}{1,2,3,4,5,6,7,8,9,0}00{a,b,c,d,f,e}

Ich ls *100*folgte dann ctrl + x, *, was meine Readline in Folgendes verwandelt:

ls a100a a100b a100c a100d a100e a100f b100a b100b b100c b100d b100e b100f c100a c100b c100c c100d c100e c100f d100a d100b d100c d100d d100e d100f e100a e100b e100c e100d e100e e100f f100a f100b f100c f100d f100e f100f

Manpage-Eintrag zum Binden:

glob-expand-word (Cx *)

Das Wort vor dem Punkt wird als Muster für die Pfadnamenerweiterung behandelt, und die Liste der übereinstimmenden Dateinamen wird eingefügt, wobei das Wort ersetzt wird. Wenn ein numerisches Argument angegeben wird, wird vor der Pfadnamenerweiterung ein '*' angehängt.

Manpage

zurückhaltend
quelle
Das funktioniert nicht (zumindest bei mir). Wenn Sie die Dateien erstellen touch aa ab ac adund ls aanschließend alt+*tippen, wird die Liste angezeigt, dies ls a*jedoch nicht. Die Platzhalter sind der Punkt der Frage.
Hooked
Dies funktioniert für mich @Hooked auf GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)und GNU bash, version 4.2.0(1)-release (x86_64--netbsd)aber nicht GNU bash, version 4.2.45(2)-release (i386-apple-darwin12.2.0). Und mit gearbeitet meine ich, dass es im Text abgelegt ist. Überprüft meine Conf-Dateien, um festzustellen, ob ich etwas Besonderes habe.
zurückhaltend
Das ist seltsam, warum sollte sich so eine einfache Sache von Version zu Version ändern? Irgendwelche Ideen, wie man es aktiviert, oder ist es zur Kompilierungszeit eingebaut?
Hooked
@Hooked Ich bin auch ein bisschen ratlos ... Es scheitert auch an meinem Himbeer-Pi GNU bash, version 4.2.37(1)-release (arm-unknown-linux-gnueabihf)(Raspbian)
zurückhaltend
@Hooked Alliterative Bindung gefunden, die auf Systemen funktioniert, auf denen die erste für mich nicht funktioniert hat.
zurückhaltend
8

Versuchen Sie dies zu ~ / .inputrc hinzuzufügen:

set show-all-if-ambiguous on

show-all-if-mehrdeutig bewirkt, dass durch einmaliges (statt zweimaliges) Drücken der Tabulatortaste alle Abschlüsse aufgelistet werden. Außerdem wird beim ersten Drücken der Tabulatortaste gemeinsame Präfixe von Glob-Ausdrücken eingefügt.

$ touch 1.0.{1,2}
$ echo *0* # I pressed tab once here
1.0.1  1.0.2
$ echo 1.0.

glob-complete-word (\ eg) würde auch *0(ohne *am Ende) vervollständigen 1.0.. Es vervollständigt auch zum Beispiel /System/Library/Launch*/*Findeauf /System/Library/LaunchAgents/com.apple.Finder.plist.

Wenn Sie konvertieren wollten , *um 1.0.1 1.0.2in dem obigen Beispiel verwendet entweder Insert-Fertigstellungen (\ e *) oder Glob-expand-Wort (\ Cx *).

Lri
quelle
4

Dieses Problem wird durch Fehler im Paket "Bash-Vervollständigung" verursacht.

Wenn das Paket nicht installiert ist, führt bash die Standardvervollständigung durch. Dies ist eine ziemlich gute allgemeine Engine zur Vervollständigung von Dateinamen.

Das "Bash-Completion" -Paket soll den Rest der Zeile betrachten und in Bezug auf die von ihm generierten Listen "klug" sein. Es ist jedoch nicht möglich, die "glob" -Erweiterung erfolgreich zu duplizieren.

Persönlich denke ich, dass das Paket viel zu sehr anstrengend ist und nur vom "dümmsten Benutzer" verwendet werden kann.

Bevor Sie es löschen, sollten Sie den oberen Rand der Datei "/ usr / share / bash-vervollständigung / bash_completion" auf nützliche Ergänzungen zu Ihrer .bashrc überprüfen, um die integrierte Bash-Vervollständigung grob zu optimieren.

Übrigens: Es wurden über hundert Fehler protokolliert ... https://bugs.debian.org/cgi-bin/pkgreport.cgi?package=bash-completion

user3710044
quelle
$ sudo yum lösche Bash-Vervollständigung #behebt das Problem für mich
user2449151