Wenn Sie unter Linux beim Eingeben eines Befehls zweimal TAB drücken, werden alle verfügbaren Befehle aufgelistet, die mit eingegebenen Zeichen beginnen.
Das ist nichts Neues, wahrscheinlich wissen Sie es bereits. Diese Funktionalität wird als Bash-Vervollständigung bezeichnet. Die grundlegende Vervollständigung von Datei- und Verzeichnisnamen ist standardmäßig in der Bash-Befehlszeile verfügbar.
Aber wir können diese Bash-Vervollständigung beschleunigen und sie mit dem Complete-Befehl auf die nächste Stufe bringen.
Dieses Tutorial erklärt, wie wir die automatische Vervollständigung auf Optionen und Befehlsargumente anwenden können, indem wir programmierbare Vervollständigung verwenden.
Wenn Sie beispielsweise nach der Eingabe des Schreibbefehls die Tabulatortaste zweimal drücken, liefert die automatische Vervollständigung eine Liste der Benutzer um den Schreibvorgang auszuführen.
$ write [TAB][TAB] bala raj jason randy john ritu mayla thomas nisha www-data
Im folgenden Beispiel würden verfügbare Hostnamen für den Telnet-Befehl angezeigt:
$ telnet [TAB][TAB] localhost dev-db fileserver
Um eine programmierbare Vervollständigung in Ihrem Terminal zu erhalten, müssen Sie nur /etc/bash_completion wie unten gezeigt ausführen,
# . /etc/bash_completion
Sie können die folgenden Zeilen auch in /etc/bash.bashrc (ab Ubuntu Linux 13.04) auskommentieren, sodass Sie den obigen Befehl nicht explizit ausführen müssen,
enable bash completion in interactive shells if ! shopt -oq posix; then if [ -f /usr/share/bash-completion/bash_completion ]; then . /usr/share/bash-completion/bash_completion elif [ -f /etc/bash_completion ]; then . /etc/bash_completion fi fi
Falls Sie diese Zeilen und die Datei /etc/bash_completion nicht finden, müssen Sie nur das Paket namens bash_completion von apt-get
installieren1. Vorhandene Bash-Vervollständigung anzeigen
Nach dem Aktivieren der programmierbaren Bash-Vervollständigung wird eine Reihe von Bash-Vervollständigungen definiert. Der Befehl complete wird zum Definieren der Bash-Vervollständigung verwendet.
Um die vorhandene Bash-Vervollständigung anzuzeigen, verwenden Sie den vollständigen Befehl wie unten gezeigt.
complete -p | less
Option -p ist im obigen Beispiel optional.
2. Liste der Standardvervollständigung in Bash
Bash bietet standardmäßig die folgende Standardvervollständigung für Linux-Benutzer.
- Variablennamen-Vervollständigung
- Vervollständigung des Benutzernamens
- Hostnamen-Vervollständigung
- Vervollständigung des Pfadnamens
- Dateinamenvervollständigung
Wir haben darüber in unserem früheren Artikel zur Bash-Standardvervollständigung gesprochen.
3. Abschluss zum Abrufen von Befehlen definieren
Definieren Sie eine Vervollständigung mit dem Befehl -c, um die Liste der verfügbaren Befehle als Argument zu erhalten. Im folgenden Beispiel wird die Vervollständigung für welchen Befehl definiert,
$ complete -c which $ which [TAB][TAB] Display all 2116 possibilities? (y or n)
Wie oben zu sehen, werden durch Drücken von „y“ alle Befehle aufgelistet.
4. Abschluss zum Abrufen von Verzeichnissen definieren
Mit Option d kann die Vervollständigung definiert werden, um nur Verzeichnisnamen als Argument zu erhalten. Im folgenden Beispiel definierte Vervollständigung für ls,
$ ls countfiles.sh dir1/ dir2/ dir3/ $ complete -d ls $ ls [TAB][TAB] dir1/ dir2/ dir3/
Wie oben zu sehen, zeigt Ihnen das Drücken der Tabulatortaste nur Verzeichnisse.
5. Abschluss zum Abrufen von Hintergrundjobnamen definieren
Mit complete ist es auch möglich, Jobnamen als Argumente für Befehle zu erhalten. Option j wird verwendet, um Jobnamen als Argumente an den Befehl job zu übergeben, wie unten gezeigt,
$ jobs [1]- Stopped cat [2]+ Stopped sed 'p' $ complete -j ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] cat sed
Apropos Hintergrundjobs:Sie sollten anhand dieser Beispiele auch wissen, wie Sie Linux-Hintergrundjobs verwalten.
6. Vervollständigung mit Präfix und Suffix
Die Vervollständigungen können mit dem gewünschten hinzuzufügenden Präfix und dem an die tatsächlichen Vervollständigungen anzuhängenden Suffix definiert werden. Im folgenden Beispiel werden Präfix und Suffix für list_job_attrib.sh,
definiert$ jobs [1]+ Stopped cat $ complete -P '">' -S '<"' ./list_job_attrib.sh $ ./list_job_attrib.sh [TAB][TAB] $ ./list_job_attrib.sh ">cat<"
7. Dateiname und Verzeichnisvervollständigung mit Ausschluss
Bedenken Sie, dass das Skript seine Ausführung abschließt, die Ausgabe wurde wie folgt in ein Ausgabeverzeichnis geschrieben
$ cd output/ $ ls all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt parser_mod.tmp extract.o
Wenn Sie oben die .tmp- und .o-Dateien für die automatische Vervollständigung mit dem Befehl ls ignorieren müssen, dann
$ export FIGNORE='.tmp:.o' $ complete -f -d ls $ cd output $ ls [TAB][TAB] all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
FIGNORE ist die Shell-Variable, die Suffixe von Dateinamen enthält und diese von der automatischen Vervollständigung ausgeschlossen werden.
8. Teilen Sie eine Zeichenfolge durch IFS, um Abschlusswerte zu erhalten
Die Wortliste kann mit der Option -W erwähnt werden und wird mit dem Wert in der IFS-Variablen geteilt. Dann wird jedes resultierende Wort erweitert und zur Vervollständigung angezeigt,
$ export IFS=" " $ complete -W "bubble quick" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
Wie oben erwähnt, wird das Wort nach dem Aufteilen der Zeichenfolge durch IFS-Trennzeichen erweitert, sodass es auch möglich ist, diese als Variablen zu verwenden, wie unten gezeigt,
$ echo $SORT_TYPE1 bubble $ echo $SORT_TYPE2 quick $ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh $ ./sort_numbers.sh [TAB][TAB] bubble quick
9. Schreiben Sie Ihre eigene Funktion, um die Vervollständigung zu generieren
Es ermöglicht Ihnen, eine Funktion einzuschließen, um die Vervollständigung zu definieren. Mit der Option -F wird der Funktionsname an den vollständigen Befehl übergeben und ausgeführt, um Vervollständigungen zu generieren. Beispielsweise werden die Funktionen wie unten gezeigt geschrieben,
_parser_options() { local curr_arg; curr_arg=${COMP_WORDS[COMP_CWORD]} COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) ); }
wo in der obigen Funktion,
- COMPREPLY :Das Array enthält die Abschlussergebnisse, die nach dem Drücken von [TAB][TAB] angezeigt werden
- COMP_WORDS :Array von Wörtern, die auf der Befehlszeile eingegeben werden
- COMP_CWORD :Index für das Array COMP_WORDS und mit dieser Position kann auf Wörter auf der Befehlszeile zugegriffen werden.
- compgen :-W enthält die möglichen Vervollständigungen und das jeweilige Argument wird basierend auf dem $current_arg ausgewählt
Diese in der Datei parser_option vorhandene Funktion wird wie unten gezeigt bezogen,
$ source parser_option
Verknüpfen Sie diese Funktion wie unten gezeigt mit Ihrem Parser-Skript,
$ complete -F _parser_options ./parser.pl $ ./parser.pl [TAB][TAB] -i --incoming -o --outgoing -m --missed
Wie oben gesehen, werden die Optionen für Parser von der Funktion _parser_options() generiert.
Hinweis:Sehen Sie sich /etc/bash_completion an, um weitere Funktionen für die programmierbare Vervollständigung anzuzeigen.
10. Sekundäre Spezifikation, wenn Primäre keine erzeugt
Wenn durch die definierte Vervollständigungsspezifikation keine Übereinstimmungen generiert werden, wird die Comp-Option für die Vervollständigung verwendet, die mit der Option -o erwähnt wird.
$ complete -F _count_files -o dirnames ./countfiles.sh
Wie oben wird die Vervollständigung mit der Funktion _count_files für die Datei ./countfiles.sh definiert. Wenn die Funktion _count_files() keine Übereinstimmung generiert, wird versucht, das Verzeichnis zu vervollständigen.
$ ls countfiles.sh dir1/ dir2/ dir3/ $./countfiles.sh [TAB][TAB] dir1 dir2 dir3