Aus LinuxUser 08/2000

Bash-Workshop

Die Bash, das unbekannte Wesen

Alle bereits einmal in einer Bash ausgeführten Befehlszeilen werden in einem Speicher – dem History-Buffer – gespeichert. Dieser Teil unserer Serie über die Bash beschäftigt sich mit diesem Speicher und zeigt den Zugriff auf die dort enthaltenen Informationen.

Ein Überblick

Im letzten Teil dieser Serie haben wir verschiedene Möglichkeiten diskutiert, um Befehlszeilen mehr oder weniger unter Zuhilfenahme interner Funktionen der Bash (genauer: der Readline-Library) aus den Informationen zu konstruieren, die der Shell intern zur Verfügung stehen. Eine Zusammenfassung der wichtigsten Tastenkombinationen zeigt Tabelle 1. Besonders die unterschiedlichen Mechanismen der Komplettierung (dem automatischen Ergänzen teilweise eingegebener Zeichenketten) sind sehr nützlich und sparen dem Anwender viele Tastendrücke. Diesmal soll mit der History ein weiteres, effektives Hilfsmittel zur Eingabe und Bearbeitung von Befehlszeilen vorgestellt werden. Die Funktionen für diesen Einsatzzweck sind in der GNU-History-Library (/lib/libhistory.so) zusammengefaßt.

Emacs-Modus

Die Eingabe der Bash kann in zwei unterschiedlichen Stilrichtungen – den Modi – erfolgen. Neben dem voreingestellten Emacs-Modus (der sich an den Gepflogenheiten dieses Editors orientiert) kann auch der VI-Editor imitiert werden. So ist sichergestellt, daß geübte Anwender sehr effektiv mit der Bash arbeiten können und nicht versehentlich falsche Tastenbefehle benutzen, die sie von ihrem Editor gewohnt sind. Die Eingabemodi werden mit dem Befehl

$> set -o vi

in den VI-Modus bzw. durch

$> set -o emacs

zurück in den Emacs-Modus geschaltet.

Tabelle 1:Die wichtigsten Editierfunktionen der Bash im Emacs-Modus

Bewegen des Cursors in der Befehlszeile
[Control-a] Sprung an den Anfang der Befehlszeile
[Control-e] Sprung ans Ende der Befehlszeile
[Control-b] ein Zeichen zurück (nach links)
[Meta-b] ein Wort zurück
[Control-f] ein Zeichen vor
[Meta-f] ein Wort vor
Löschen und „killen“ von Teilen der Befehlszeile
[Control-h] Zeichen links löschen
[Control-d] Zeichen unter dem Cursor löschen
[Control-k] Zeile ab Cursorposition killen
[Meta-d] Wort links killen
[Control-u] Zeile killen
[Control-w] Wort links killen
[Meta][Control-h],[Meta][Control-?] Wort links löschen
[Control-x][Control-?] Löschen bis zum Zeilenanfang
Einfügen gekillter Passagen
[Control-y] Einfügen aus dem Kill-Ring
[Meta-y] Kill-Ring rotieren
[Meta-.] ’ntes Argument der vorigen Zeile einfügen
Andere Funktionen
[Control-g] Aktion abbrechen
[Control-j],[Return] Zeile ausführen
[Control-]] Sprung zum nächsten Auftreten des Buchstabens
[Meta][Control-]] Sprung zum vorherigen Auftreten des Buchstabens
[Control-l] Terminal löschen
[Control-i] komplettieren
[Meta-!] Befehlsnamen komplettieren
[Meta-/] Dateinamen komplettieren
[Meta-@] Hostnamen komplettieren
[Meta-~ ] Usernamen komplettieren
[Meta-$] Variablennamen komplettieren
[Meta-{] Komplettieren in Klammern
[Control-x][Control-v] Shellversion anzeigen
[Control-x][Control-r] Initfile erneut einlesen
[Control-_],  
[Control-x][u] Undo
[Meta][Control-r] Komplettes Undo der Zeile
[Meta-l] Wort in Kleinbuchstaben umwandeln
[Meta-c] Wort mit einem Großbuchstaben beginnen lassen
[Control-t] Vertauschen der Buchstaben um den Cursor
[Meta-t] Vertauschen der Wörter um den Cursor
[Meta-0] bis [Meta-9] Numerische Argumente eingeben
Suchen im Historybuffer
[Control-r] Rückwärtiges Suchen im Historybuffer
[Control-s] Vorwärts im Historybuffer suchen
[Meta][Control-i] Komplettieren aus dem Historybuffer
[Control-<] An den Anfang des Historybuffers
[Control-n] Nächste Historyzeile anzeigen
[Control-p] Vorige Historyzeile anzeigen

Alle Befehlszeilen werden in einer speziellen Datei – der History-Datei – gespeichert. Diese History-Datei stellt damit zum einen eine Art Logbuch dar, anhand dessen Einträge der Anwender sich vergegenwärtigen kann, welche Aktionen bereits ausgeführt wurden; andererseits ermöglicht sie das Lernen aus der Vergangenheit. Eine gute Lösung, die in Form von mehreren Befehlszeilen in der History-Datei vorhanden ist, kann mit wenig Aufwand in ein Shell-Programm (Script) umgesetzt werden.

Die vorhergehenden Befehlszeilen haben übrigens auch für die Konstruktion neuer Zeilen eine besondere Bedeutung. Oftmals sind Eingaben wie die folgenden zu beobachten:

$> ls /usr/share/info
...
bash.info  fileutils.info  libg++.info-4
...
$> cp /usr/share/info/bash.info .
$> emacs /usr/share/info/bash.info
$> info  /usr/share/info/bash.info

In diesen Befehlszeilen entspricht mindestens ein Argument in der aktuellen Befehlszeile einem der vorhergehenden, bzw. bezieht sich darauf. In den meisten Fällen handelt es sich um das letzte Argument der vorhergehenden Befehlszeile. Anwender können sich mit einer ganz einfachen Tastenkombination hier erheblichen Tippaufwand ersparen:

$> ls /usr/share/info
...
$> cp [META][.] /usr/share/info/ba[Tab]sh.info ...

Durch die Tastenkombination [Meta]+[.] fügt der Bashzeileneditor automatisch das letzte Argument der vorherigen Befehlszeile an der aktuellen Position ein. (Nochmals zur Erinnerung: Die Meta-Taste wird auf den normalen Keyboards durch die linke Alt-Taste emuliert oder alternativ durch das Drücken der Esc-Taste vor der Eingabe der zweiten Taste.) Die verwendete Readline-Funktion heißt insert-last-argument. Für Spezialisten: Beim Übergang von der zweiten (cp ...) zur dritten Zeile (emacs...) wird aber nicht das letzte, sondern das vorletzte (das in der Befehlszeile erste) Argument benötigt. Auf dieses kann ganz einfach mit der Funktion yank-nth-arg zugegriffen werden, die an die Tastenkombination [Meta-Control-y] gebunden ist. Die Zählweise der Bash beginnt hierbei mit dem 0ten Argument (dem Befehl) an der ersten Position in der Befehlszeile.

Ein zweiter, sehr nützlicher Mechanismus wird als Quick-Substitution bezeichnet und verwendet ebenfalls die Informationen aus der letzten Befehlszeile. In manchen Situationen ändern sich aufeinanderfolgende Befehlszeichen nur geringfügig:

$> ls ~/test -r
$> rm ~/test -r

In diesem Fall kann die zweite Befehlszeile aus der ersten konstruiert werden, indem ls durch rm ausgetauscht wird. Genau dies ermöglicht die Quick-Substitution:

$> ls ~/test/ -r
$> ^ls^rm[Return]
rm ~/test/ -r
rm: in Verzeichnis <C>test<C> absteigen?

Die Substitution ist nicht auf die Befehle in der Befehlszeile beschränkt:

$> ls ~/test/ -r
$> ^st^st1[Return]
ls ~/test1/ -r
...

Jede beliebige Zeichenfolge kann ausgetauscht werden, allerdings wird nur das erste Auftreten der Zeichen ersetzt.

Die Befehlszeilenhistory (so der korrekte Name) ist zu jedem Zeitpunkt über die Aufwärts-Pfeil-Taste [Cursor hoch] erreichbar. Jede Betätigung dieser Taste holt eine weitere zuvor ausgeführte Befehlszeile zurück. Diese Befehlszeilen können normal editiert werden, die Return-Taste führt die aktuelle Zeile – so wie sie momentan dargestellt wird – aus. Auch das Scrollen in die Gegenrichtung ist möglich: Sind Sie durch allzu heftigen Einsatz der Aufwärts-Pfeil-Taste zu weit in die Geschichte eingetaucht, dann können Sie mit der Abwärts-Pfeil-Taste wieder in Richtung Gegenwart wandern.

Die History-Datei

Die Befehlszeilenhistory wird von der Bash in Form einer Datei gespeichert. Die Bash legt diese Datei im Home-Verzeichnis unter dem Namen .bash_history automatisch an oder, sofern diese Datei bereits existiert, liest sie sie beim Start ein. In dem zweiten Fall wird damit der Inhalt der Datei automatisch in den eingebauten Historybuffer der Bash kopiert. Damit sind die Zeilen über die Cursortasten erreichbar.

LinuxUser 08/2000 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: