Es kommt mir oft vor, dass Bash die automatische Vervollständigung für bestimmte Befehle deaktiviert. Dies zwingt mich, dem Befehlsnamen ein zufälliges Symbol hinzuzufügen, die automatische Vervollständigung zu verwenden und dann den Befehlsnamen zu korrigieren. Das ist ziemlich nervig. Zum Beispiel:
# I type:
openvpn s<tab>
# Nothing happens, so I add x
openvpnx s<tab>
# Now this expands to
openvpnx somepath
# Same with ./configure or many other commands...
Gibt es eine Möglichkeit, die Deaktivierung zu deaktivieren, damit die automatische Vervollständigung IMMER funktioniert?
bash
autocomplete
Petr
quelle
quelle
complete -p openvpn
, bekomme ichbash: complete: openvpn: no completion specification.
Aber das Drücken der Tabulatortaste nach dem Tippenopenvpn
bringt nichts. Wenn ichcomplete -r
alle Vervollständigungen lösche und dann nach der Eingabe die Tabulatortaste drückeopenvpn
, erhalte ich eine normale dateibasierte Vervollständigung. Dasno completion specification
ist messleading. Da es den gleichen Fehler für nicht existierende Befehle zurückgibt, zum Beispiel, wenn ich es tuecomplete -p nonexistent
.Antworten:
Auflistung der Vervollständigungen
Sie können sehen, was Bash / Readline zum Ausführen eines Befehls verwendet
complete -p command
, z. B. wenn ich ausgeführt werdecomplete -p openvpn
, erhalte ichDies zeigt, dass die von meiner Shell verwendete Readline keine spezifische Vervollständigung für den
openvpn
Befehl hat, sodass standardmäßig die traditionelle Form der Vervollständigung verwendet wird, dh Dateinamen.Ein weiteres Beispiel (um eine definierte Vervollständigung zu demonstrieren):
Dies zeigt an, dass eine benannte Funktion
_filedir_xspec
verwendet wird, um Vervollständigungen für dendillo
Befehl bereitzustellen .Vervollständigungen entfernen
Verwenden Sie die
-r
Option mit dercomplete
integrierten Option, um eine definierte Vervollständigung zu entfernen :quelle
complete -p <COMMAND>
träge lädt und möglicherweise erst funktioniert, wenn die Vervollständigung für COMMAND aufgerufen wurde.Bash hat programmierbare Vervollständigung . Seit 1999 ist es möglich, die Vervollständigung von Befehlsargumenten an den Befehl anzupassen und nicht nur Dateinamen zu vervollständigen. Dateinamen sind die Standardeinstellungen, wenn keine befehlsspezifische Vervollständigung konfiguriert wurde (daher erhalten Sie Dateinamen, wenn Sie den Befehl in ändern
openvpnx
).Die programmierbare Vervollständigung wird normalerweise durch Laden aktiviert
/etc/bash_completion
. Wenn Sie keine programmierbare Vervollständigung wünschen und Dateinamen auch in Kontexten, in denen Dateinamen keinen Sinn ergeben, immer vervollständigen möchten, entfernen Sie diese aus Ihrer.bashrc
.Es scheint, dass Sie eine benutzerdefinierte Vervollständigung für Argumente für den
openvpn
Befehl haben und dass dieser Vervollständigungscode nichts für das erste Argument bietet. Ich weiß nicht, warum das so ist, es könnte ein Fehler im Abschlusscode sein. Nützlicher Vervollständigungscode würde Optionen und ihre Argumente vervollständigen. Führen Sie auscomplete -p openvpn
, um festzustellen, für welchen Code Argumente vervollständigt werdenopenvpn
. Sie können diesen benutzerdefinierten Abschlusscode mit deaktivierencomplete -r openvpn
, aber dann kehren Sie nur zu den Dateinamen zurück, was in der Befehlszeile vonopenvpn
nur nach einigen Optionen nützlich ist .Unabhängig von den Abschlusseinstellungen können Sie einen Dateinamen jederzeit vervollständigen, indem Sie
complete-filename
(Standardbindung :)M-/
anstelle voncomplete
(TAB
) aufrufen .quelle
configure
, nicht für ist./configure
. Es wird der Basisname des Befehls berücksichtigt, nicht der vollständige Pfad.Das erste Problem ist, dass der
openvpn
Binärname mit seinem Eintrag im Verzeichnis init.d übereinstimmt.ergibt
Unter Ubuntu und Derivaten stammt dies aus dem Code in
/usr/share/bash-completion/bash_completion
(Teil desbash-completion
Pakets).Kommentieren Sie diesen Block aus. Starten Sie Ihre Bash-Instanz neu. Versuchen Sie, die automatische Vervollständigung
openvpn
mit TAB durchzuführen, und tun Sie diesDas produziert
Das zweite Problem kommt von
/usr/share/bash-completion/completions/openvpn
. Es versucht, .conf-Dateien aus / etc / openvpn automatisch zu vervollständigen und ist ein Hindernis, wenn Sie versuchen, openvpn mit einer Ad-hoc-Konfigurationsdatei auszuführen, die außerhalb von / etc / openvpn liegt.Löschen Sie es einfach und starten Sie Ihre Bash-Instanz neu.
Jetzt sollten Sie die Standard-Dateivervollständigung für den Befehl openvpn mit der TAB-Taste erhalten.
Wenn du läufst
Nachdem Sie versucht haben, nach openvpn automatisch zu vervollständigen, sollten Sie jetzt erhalten
Ein besserer Ansatz wäre gewesen, Bash-Completion-Skripte für openvpn zu reparieren / zu erweitern. Aber das ist eine Geschichte für einen anderen Tag.
Wenn Sie später zum ursprünglichen Zustand des
bash-completion
Pakets zurückkehren möchten, installieren Sie es einfach mit dem folgenden Befehl neu.quelle
Der traurige Teil meiner Antwort ist: Bash (via Readline) hat so viele Möglichkeiten zur Vervollständigung. Eine normale Linux-Distribution kann jedoch die grundlegende Dateinamenerweiterung mit [tab] (oder [tab] [tab]) durch Hinzufügen einer Optionserweiterung stören . In meinem Fall ist es das Paket "Bash-Vervollständigung" , das mir das im ursprünglichen Q beschriebene Verhalten verleiht.
Es ist nicht nur ein
openvpn
Problem. Q sagt: "zum Beispiel".Mit
bind -p | grep complete
bekomme ich:Hier ist TAB = ctrl-i an die Grundfunktion gebunden
complete
. Die anderen Bindungen auf meinem Archlinux habe ich gerade ausprobiert. Mit "ta [esc] [star]" kann ich alle Befehle ab "ta" in meine Befehlszeile einfügen.Die
complete
Readline-Funktion wird in man bash erklärt:Ich kann das nur teilweise reproduzieren. Ich denke, man bash vergisst zu erwähnen, dass es davon abhängt, ob Sie ein erstes Wort oder ein zweites, drittes usw. Wort [tab].
Ich habe Dateien, die mit "ba" beginnen, in meinem Heim- / Arbeitsverzeichnis. Wenn ich an der Eingabeaufforderung "ba [tab]" eingebe, erhalte ich diese Namen nicht, sondern nur Befehle von
badblocks
bisbashbug
. Dies ist ein vernünftiges Verhalten: Das erste Wort gibt Ihnen Befehle, die folgenden Wörter Dateinamen. Und wenn Sie "$ [tab]" eingeben, erhalten Sie wirklich eine schöne Liste von Variablennamen.Wenn ich [Tab] sage, meine ich eigentlich [Tab] [Tab]. Aber wir gewöhnen uns so sehr daran, dass wir nicht einmal bemerken, was diese "vollständige" Readline-Funktion alles macht. Mit den Variationen "complete-" können Sie steuern, wonach gesucht wird (Befehl, Dateiname, Variable) und was mit der Liste zu tun ist, wenn mehr als eine Übereinstimmung vorliegt (Möglichkeit).
Diese Readline-Funktionen werden mit vielen Standardbindungen geliefert. Beide
man bash
undman readline
listen die Funktionen und ihre Standardbindungen auf. Verwenden Sie zum Überprüfen bind -p wie oben. Dies ist auch die Basis für die~/.inputrc
Datei. Ich habe gerade eine gemacht (es gab nur eine kryptische / etc / inputrc):Mit farbigen Statistiken bekomme ich eine farbige Liste, wie bei
ls --color
. Nach "bi [tab] [tab]" sehe ich "bind" in Weiß und "bison" in grün, was mir sagt, dass "bind" keine ausführbare Datei ist (sondern eine eingebaute ... dies ist eine BEFEHLserweiterung ... "bind" ist nicht einmal ein Dateiname!).Dies steuert die Registerkarte im Vergleich zur doppelten Registerkarte. Nachdem ich es hinzugefügt und eingegeben habe
Ich bekomme direkt eine farbige Liste aller Dateinamen. Verzeichnisse, Links, normale Dateien usw. werden alle in ihrer eigenen Farbe angezeigt.
Diese Readline-Variablen können Sie mit sehen
bind -v
. Um eine .inputrc-Änderung zu testen, starten Sie eine neue Bash mit "bash" und beenden Sie dann. Oder erneut anmelden.Die nächste Schicht ist in
/usr/share/bash-completion
Es enthält Skripts pro Befehl, hauptsächlich aus den Paketen util-linux und systemd. Es gibt eine Mount- (2 Kb) und eine Systemctl- (13 Kb) Datei. Die Mount-Datei ist interessant: Sie gibt Ihnen / proc / filesystems, nachdem Sie "-t" eingegeben haben.
Normalerweise erhalte ich nach "mount -t [tab]" FILENAMES. Nachdem ich diese "Mount" -Datei gefunden habe, bekomme ich wirklich fs-Typen wie ext2, ext3 und ext4. Ich gehe:
um diese Funktion zu entfernen. (Dies
complete
ist ein Shell-eingebauter Befehl)Die dritte Schicht ist das zusätzliche "Bash-Completion" -Paket . Ich habe es bereits deinstalliert, nachdem ich es zum Testen installiert hatte. Mit diesem Paket habe ich diese nette Funktion zum Erweitern von Optionen und auch Paketnamen erhalten. Ich könnte "tar - [tab]" eingeben und sehe alle Optionen. Aber die Dateinamenerweiterung ging in vielen Konstellationen verloren. Amd nicht nur auf Archlinux.
Dieses Bash-Completion-Paket gab mir ein 2000-Zeilen-Skript "bash_completion" und viele Befehlsdateien. Die für "Teer" war 700 Zeilen voller Funktionen. Dies zu beheben ist also keine Lösung.
Wenn Sie sich wirklich für diese [Tab] vollständigen Feinheiten interessieren, müssen Sie unten beginnen und eine oder zwei Readline-Funktionen auswählen
complete
, die nicht an andere Tasten als [Tab] gebunden sind. Meine obige Standardkonfiguration funktioniert wirklich, aber ich habe nie etwas anderes als [tab] verwendet. Jetzt möchte ich die richtigen Funktionen auf die richtigen Tasten einstellen. Mit oder ohne dieses optionserweiternde Bash-Completion-Paket.quelle