Wie funktioniert die Vervollständigung der Bash-Registerkarte?


113

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?


2
Vielleicht möchten Sie es überprüfen /etc/bash_completion(zumindest ist dort ein Großteil der Magie in Debian).
Wrikken

1
@Wrikken: Das ist bash_completion, was von der Tab-Vervollständigung abhängt, aber nicht ganz davon, wie es passiert.
Ignacio Vazquez-Abrams

Antworten:


100

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 Beispiel complete -u susagt , wenn ein Argument für den Abschluss suBefehl, 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_completionein 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.


1
Manpages gibt es nur für unabhängige Befehle, nicht für Shell-Buildins. Aber es ist Teil des Bash-Handbuchs, das ich verlinkt habe.
Paŭlo Ebermann

7

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.