Login


 
Newsletter
Werbung

So, 25. Mai 2003, 00:00

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.

Kommentare (Insgesamt: 0 || Kommentieren )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung