Programmierbare Eingabe-Vervollständigung in Bash
Dieser Artikel stellt das eingebaute Kommando complete der bash-Shell und das Programm bash-completion vor.
Vorwort
Seit Version 2.04 verfügt die Bourne Again Shell (bash) über die Möglichkeit, die automatische Eingabe-Vervollständigung durch eigene Definitionen zu erweitern. Ein Tool, das hiervon intensiv Gebrauch macht, ist bash-completion. Es ist zu finden unter http://www.caliban.org/bash/index.shtml#completion. Bei Debian ist es bereits in das bash-Paket integriert, muß aber manuell aktiviert werden.
Installation
Das Paket muß lediglich heruntergeladen und entpackt werden, normalerweise ins Verzeichnis /etc. Das folgende Listing zeigt, wie die Eingabe-Vervollständigung aktiviert wird, nachdem man das Paket installiert hat. Es wird an /etc/bashrc angefügt. Bei Debian heißt die Datei /etc/bash.bashrc. Die bereits vorhandenen Zeilen zur Aktivierung, die auskommentiert sind, kann man löschen.
bash=${BASH_VERSION%.*} bmajor=${bash%.*}; bminor=${bash#*.} if [ "$PS1" ] && [ $bmajor -eq 2 ] && [ $bminor '>' 04 ] \ && [ -f /etc/bash_completion ]; then # interactive shell # Source completion code . /etc/bash_completion fi unset bash bmajor bminor
Die Eingabe-Vervollständigung wird normalerweise mit der TAB-Taste aktiviert (auch das ist in bash konfigurierbar). Die Standardeinstellung ist, bei einer Mehrdeutigkeit nichts zu tun und erst bei einer zweiten Betätigung von TAB die Liste der möglichen Ergänzungen zu zeigen. Es ist empfehlenswert, das zu ändern. Dazu fügt man in /etc/inputrc (global für alle Benutzer) oder ~/.inputrc (für individuelle Benutzer) folgendes Kommando ein:
set show-all-if-ambiguous on
Was die Shell alleine kann
Was kann die Eingabe-Vervollständigung alles? Die folgende Beschreibung muß zwangsläufig unvollständig sein, da das Programm ständig weiter entwickelt wird.
Zunächst gibt es da die Standard-Features der Shell, die jeder, der mit der Shell gearbeitet hat, kennen dürfte. Sie stehen auch in der Manpage und im README von bash_completion.
Das erste Wort einer Zeile wird als Kommando interpretiert; hier tritt die Kommando-Vervollständigung in Kraft. Dabei sucht die Shell im ganzen Pfad sowie unter den Aliasen und Shell-Funktionen nach passenden Ergänzungen.
Alle folgenden Wörter sind Argumente des Kommandos. Oft sind das Dateinamen, daher bietet die Shell zur Vervollständigung die Dateinamen des aktuellen Verzeichnisses an. Natürlich kann man auch ein Verzeichnis angeben (z.B. /usr) und bekommt dann die Dateinamen unter /usr zur Auswahl.
Gibt man ~ ein und vervollständigt dann, so werden die Benutzernamen, die dem System bekannt sind, zur Auswahl angeboten. Beginnt das Argument dagegen mit @, dann versucht die Shell, dies zum Hostnamen zu ergänzen. Beginnt man mit $, dann wird bash versuchen, eine Umgebungsvariable zu ergänzen.
Die Erweiterungen von bash-completion
Set Version 2.04 gibt es das neue Shell-Kommando complete
. Wenn man dieses ohne Argumente eingibt, erhält man entweder nichts oder eine Liste, die Zeilen wie die folgenden enthält und zunächst einmal nicht viel aussagt:
complete -o filenames -F _longopt ld complete -F _kill kill complete -F _renice renice complete -j -P '%' jobs complete -d pushd complete -o filenames -F _filedir_xspec playmidi complete -o filenames -F _filedir_xspec bzdiff complete -o filenames -F _querybts querybts
Der Witz ist nun, daß die Ergänzung für jedes eingegebene Kommando (Sie erinnern sich? Das erste Wort einer Zeile) individuell konfiguriert werden kann. Das ist das letzte Wort jeder complete
-Zeile im obigen Listing. Das Paket bash-completion bringt schon zahlreiche Definitionen mit, und es werden in jeder Version mehr.
Geht man z.B. in ein Verzeichnis mit einem Makefile und gibt make
und ein TAB ein, dann erscheint als Auswahl eine Liste aller definierten Targets in dem Makefile, ohne daß man less oder einen Editor starten müßte, um die Datei anzusehen.
Gibt man ssh
ein und danach TAB, dann wird die Liste der known_hosts gelesen und diese Hosts als Auswahl angeboten. Bei zahlreichen Programmen ist es möglich, --
als Argument anzugeben, und nach einem TAB erhält man eine Auswahl aller langen Optionen, die das Programm anbietet. Das ist sicherlich praktischer, als --help
einzugeben oder die Manpage zu öffnen, um die richtige Option zu finden. Es funktioniert mit df, aber auch z.B. mit configure.
Komplettiert man unter Debian das Kommando reportbug
, so erhält man eine Auswahl aller verfügbaren Debian-Pakete - das kann jedoch ein paar Sekunden dauern. Nach kill
erhält man eine Liste der Prozeß-IDs. Nach ncftp
, einem FTP-Client, erhält man eine Liste aller Bookmarks des Programmes. Nach tar
und jar
gibt die Komplettierung eine Liste von Kommandos an, die folgen können. Ich höre hier auf, bash-completion kann noch mit hunderten weiterer Kommandos umgehen.
Eigene Erweiterungen hinzufügen
bash-completion bietet schon unglaublich viel, aber sollten Sie dennoch etwas hinzufügen wollen, müssen Sie sich zunächst mit dem Shell-Kommando complete
vertraut machen.
Das Kommando complete
Um complete
zu verstehen, muß man zunächst die Manpage von bash(1) lesen. Denn die Hilfe mit help complete
ist nicht ausreichend. Die Beschreibung findet sich im Abschnitt Programmable Completion. Die Argumente des complete
-Kommandos sind unter Shell Builtin Commands erklärt. Das Kommando hat so viele mögliche Optionen, daß bald jeder Buchstabe belegt scheint. Viele davon stellen sich aber als Abkürzungen für andere heraus, so ist z.B. -g
eine Abkürzung von -A group
. Diese Option bewirkt, daß die möglichen Komplettierungen aus den auf dem System existierenden Gruppen bestehen.