Ich habe in letzter Zeit viel Zeit in der Shell verbracht und frage mich, wie die automatische Vervollständigung der Registerkarte funktioniert. Was ist der Mechanismus dahinter? Woher kennt die Bash den Inhalt jedes Verzeichnisses?
bash
shell
autocomplete
CamelBlues
quelle
quelle
/etc/bash_completion
(zumindest ist dort ein Großteil der Magie in Debian).Antworten:
Die automatische Vervollständigung besteht aus zwei Teilen:
Die Readline-Bibliothek verwaltet, wie bereits von fixje erwähnt, die Befehlszeilenbearbeitung und ruft beim Drücken der Tabulatortaste zum Bash auf, um den Abschluss zu ermöglichen. Bash gibt dann (siehe nächster Punkt) eine Liste möglicher Vervollständigungen und readline fügt so viele Zeichen ein, wie durch die bereits eingegebenen Zeichen eindeutig identifiziert werden. (Sie können die readline-Bibliothek ziemlich genau konfigurieren, siehe Abschnitt Befehlszeilenbearbeitung des Bash Handbuch für Details.)
Bash selbst verfügt über die integrierte Funktion
complete
, um einen Vervollständigungsmechanismus für einzelne Befehle zu definieren. Wenn für den aktuellen Befehl nichts definiert ist, wurde die Vervollständigung nach Dateiname verwendet (unter Verwendung von opendir / readdir, wie Ignacio sagte).Der Teil zum Definieren Ihrer eigenen Vervollständigungen wird im Abschnitt Programmierbare Vervollständigung beschrieben . Kurz gesagt, mit
complete «options» «command»
definieren Sie die Vervollständigung für einen Befehl. Zum Beispielcomplete -u su
sagt , wenn ein Argument für den Abschlusssu
Befehl, für die Nutzer des aktuellen Systems suchen .Wenn dies komplizierter ist, als die normalen Optionen abdecken können (z. B. unterschiedliche Vervollständigungen je nach Argumentindex oder abhängig von vorherigen Argumenten), können Sie verwenden
-F function
, wodurch eine Shell-Funktion aufgerufen wird, um die Liste möglicher Vervollständigungen zu generieren. (Dies wird zum Beispiel für die Git-Vervollständigung verwendet, die sehr kompliziert ist, abhängig vom Unterbefehl und manchmal von den angegebenen Optionen und manchmal von Namen von Zweigen (von denen bash nichts weiß).Sie können die vorhandenen Vervollständigungen, die in Ihrer aktuellen Bash-Umgebung definiert sind, einfach auflisten
complete
, um einen Eindruck davon zu bekommen, was möglich ist. Wenn Sie das Bash-Completion-Paket installiert haben (oder wie auch immer es auf Ihrem System benannt ist), werden Vervollständigungen für viele Befehle installiert und enthalten, wie Wrikken sagte,/etc/bash_completion
ein Bash-Skript, das dann häufig beim Shell-Start ausgeführt wird, um dies zu konfigurieren. Zusätzliche benutzerdefinierte Abschlussskripte können eingefügt werden/etc/bash_completion.d
. diese stammen alle von/etc/bash_completion
.quelle
Wenn Sie an den Grundlagen interessiert sind: Bash verwendet Readline mit Verlauf und grundlegender Vervollständigung. Sie können die Quelle überprüfen, wenn Sie ein detailliertes Verständnis erhalten möchten. Darüber hinaus können Sie readline verwenden, um Ihre eigenen CLI-Schnittstellen mit Abschluss zu erstellen
quelle