next up previous contents index
Next: Anpassung des Kommandozeileneditors Up: bash Previous: Der Kommandozeileneditor

Der Kommandozeilenspeicher (history)

      Die bash speichert eine gewisse Anzahl kompletter Kommandozeilen ab und erlaubt dem Benutzer, den Kommandozeilenspeicher auf zwei verschiedene Weisen anzusprechen.

Die Anzahl der gespeicherten Kommandozeilen kann mit der Shellvariablen HISTSIZE eingestellt werden. Weitere Einstellungen können mit den Variablen HISTFILE HISTFILESIZE und history_control vorgenommen werden. Die Benutzung dieser Variablen wird ab Seite gif beschrieben.

Der Kommandozeilenspeicher im Editor

  Im Gegensatz zu den Vorbildern emacs oder vi ist für den Kommandozeileneditor der Arbeitsbereich auf die aktuelle Zeile beschränkt. Absätze und Seiten existieren hier nicht. Mit dem Kommandozeilenspeicher eröffnet sich aber doch eine zweite Dimension, die das Blättern und Suchen in alten Zeilen zu einer praktischen Erweiterung des Editors macht.
Abschluß einer Kommandozeile (RETURN)
Wie bereits gesagt, wird jede Kommandozeile mit einem Zeilenende (RETURN) abgeschlossen. Dabei ist es egal, wo sich die Einfügemarke innerhalb der Zeile gerade befindet, es wird immer die gesamte Zeile bearbeitet. Wenn sie nicht leer ist, wird sie sofort im ``rohen'' Zustand in den Kommandozeilenspeicher übernommen.gif Wenn die Shellvariable history_control das Wort ` ignorespace' enthält, werden Kommandozeilen, die mit einem Leerzeichen beginnen, nicht gespeichert. Enthält die Variable das Wort ` ignoredups', werden nur die Kommandozeilen gespeichert, die sich von der zuletzt gespeicherten unterscheiden. Mit ` ignoreboth' werden die beiden Features eingeschaltet.

Wie alle Funktionen des Editors kann diese Funktion auf beliebige Tasten gelegt werden, wenn auch in diesem Fall davon abzuraten ist. ( accept-line)

Kommando zurück (C- p)
blättert im Kommandozeilenspeicher eine Position zurück und gibt die komplette Zeile zum Editieren auf den Bildschirm. Diese Funktion ist auch an die HOCH-Taste des Cursorblocks gebunden. ( previous-history)
Kommando vorwärts (C- n)
blättert im Kommandozeilenspeicher eine Position vorwärts und gibt die komplette Zeile zum Editieren auf den Bildschirm. Diese Funktion ist auch über die RUNTER-Taste des Cursorblocks zu erreichen. ( next-history)
zum ersten Kommando (M-<)
holt die erste Kommandozeile aus dem Kommandozeilenspeicher in den Editor. ( beginning-of-history)
zum letzten Kommando (M->)
holt die letzte Kommandozeile aus dem Kommandozeilenspeicher in den Editor. end-of-history)
Kommando inkrementell rückwärts suchen (C- r)
sucht schrittweise (inkrementell) rückwärts im Kommandozeilenspeicher nach einer Kommandozeile mit exakt passendem Muster. Das gesuchte Muster wird interaktiv eingegeben und die erste passende Zeile sofort angezeigt. Reguläre Ausdrücke im Muster werden nicht interpretiert, sondern buchstäblich mit den gespeicherten Kommandozeilen verglichen. Das Suchmuster kann mit BACKSPACE schrittweise zurückgenommen werden; das erste andere Editorkommando während der interaktiven Eingabe des Suchmusters beendet die Suche. ( reverse-search-history)
Kommando rückwärts suchen (C- p)
sucht nach der vollständigen Eingabe einer Zeichenkette die erste darauf passende Kommandozeile in der History. ( non-incremental-reverse-search-history)
Kommando inkrementell vorwärts suchen (C- s)
sucht mit jedem weiteren eingegebenen Buchstaben schrittweise (inkrementell) vorwärts im Kommandozeilenspeicher von der aktuellen Zeile an nach einer Kommandozeile mit einem bestimmtem Muster. Die Bearbeitung des Musters erfolgt in der gleichen Weise wie beim reverse-search-history-Editorkommando. ( forward-search-history)
Kommando vorwärts suchen (M- n)
sucht nach der Eingabe einer Zeichenkette vorwärts in der History nach der ersten passenden Kommandozeile. ( non-incremental-forward-search-history)
Kommandozeile erweitern (M-C- e)
führt die weiter unten beschriebene History-Expansion im C-Shell-Stil und die Synonymerweiterung aus, ohne die Kommandozeile auszuführen. Die Zeile kann daraufhin weiter bearbeitet werden. ( expand-line)
letztes Argument einfügen (M-., M-_)
fügt das letzte Argument des letzten Kommandos an der Einfügemarke ein. ( insert-last-argument)
n-tes Argument einfügen (M-C- y)
fügt das n-te Argument der letzten Kommandozeile beim Cursor ein. Die Zahl wird als Argument (siehe oben) dem Kommando vorangestellt, Defaultwert ist 1. ( yank-nth-arg)
ausführen und nächstes Kommando (C- o)
führt das mit den Cursortasten in die Kommandozeile zurückgeholte Kommando aus und gibt nach dessen Beendigung automatisch die auf die ausgeführte Zeile folgende Zeile aus der History aus. ( operate-and-get-next)

History im C-Shell-Stil

Zusätzlich zu den oben beschriebenen Tastenfunktionen des Editors kann der Kommandozeilenspeicher mit einem History-Mechanismus benutzt werden, dessen Verwendung der C-Shell nachempfunden ist.gif Diese History-Expansion kann mit dem Shellkommando set +H ausgeschaltet werden.

In der C-Shell ist es möglich, einzelne Wörter aus bestimmten Kommandozeilen im Kommandozeilenspeicher in die aktuelle Kommandozeile zu integrieren. Dazu wird zuerst eine Kommandozeile referenziert und danach ein Wort in dieser Kommandozeile angesprochen.

Bezugnahme auf eine frühere Kommandozeile

Zum Auswählen einer Kommandozeile im Kommandozeilenspeicher gibt es verschiedene Möglichkeiten. Prinzipiell leitet ein Ausrufezeichen ` !' die History-Substitution ein. Nur wenn das Ausrufezeichen nach einem Fluchtsymbol `\' steht oder von einem SPACE, RETURN, TAB, `=' oder ` (' gefolgt wird, findet die Substitution nicht statt.

Anstelle des Ausrufezeichens kann in der Shellvariablen histchars auch ein anderes Zeichen mit dieser Funktion belegt werden.

!!
wählt die letzte Zeile im Kommandozeilenspeicher.
!n
wählt die Zeile Nummer n.
!-n
wählt die aktuelle Zeile minus n
! Zeichenkette
wählt die letzte Kommandozeile, deren Anfang mit der Zeichenkette übereinstimmt.
!? Zeichenkette [? ]
wählt die letzte Kommandozeile, in der die Zeichenkette an irgendeiner Position vorkommt.
^ Alt^Neu
ist eine Abkürzung für !!:s^Alt^Neu^ zur Ersetzung der Zeichenkette Alt durch Neu in der letzten Kommandozeile. Diese Konstruktion muß allein auf der Kommandozeile stehen.
!#
steht für die aktuelle Kommandozeile bis hier hin.

Bezugnahme auf ein Wort einer früheren Kommandozeile

Auf die Kommandozeilenreferenz kann eine Wortreferenz folgen. Diese Wortreferenz wird durch einen Doppelpunkt ` :' von der Zeilenreferenz getrennt. Wenn die Wortreferenz mit einem `^', ` $', ` *' oder ` %' beginnt, kann der Doppelpunkt auch weggelassen werden. Die Wörter einer Kommandozeile sind vom Zeilenanfang an mit Null beginnend numeriert.

n
bezeichnet das nte Wort. Das Wort 0 ist in der Regel der Kommandoname.
^
(Caret) steht für das erste Argument (das ist Wort Nummer 1).
$
bezeichnet das letzte Argument.
%
steht für das bei ? Zeichenkette ? gefundene Wort.
n-m
ist der Bereich vom nten bis zum mten Wort
*
steht für alle Argumente, also die Wörter 1-$. Wenn das Kommando nur aus einem Wort besteht, wird die leere Zeichenkette zurückgeliefert.

Modifikation der bezogenen Kommandozeilen

Nach (oder anstelle) der Wortreferenz können noch ein oder mehrere Zeichen zur Modifikation des bezogenen Wortes folgen. Diese Zeichen werden wieder durch Doppelpunkte getrennt.

h
schneidet alle Zeichen nach dem letzten Slash von dem referenzierten Bereich der Kommandozeile ab. Die Funktion ist in gewisser Weise mit dem dirname-Shellutility (-> Seite gif) vergleichbar.  
r
schneidet eine Endung der Form `.xxx' nach dem letzten Punkt ab.
e
läßt nur die Endung in der oben beschriebenen Form übrig.
t
entfernt aus dem referenzierten Bereich der Kommandozeile alles bis zum letzten Slash. Die Funktion ist dem basename- Shellutility (-> Seite gif) vergleichbar.   
p
zeigt die entstandene Kommandozeile sofort an, ohne sie auszuführen.
[g]s/ Alt/ Neu[/]
ersetzt die Zeichenkette Alt bei ihrem ersten Auftreten durch Neu. Durch den Zusatz g kann erreicht werden, daß alle Vorkommen von Alt ersetzt werden. Anstelle der Slashes können beliebige andere Zeichen benutzt werden.

Beispiele für die History-Funktion

Auf den ersten Blick ist die C-Shell History-Funktion wahrscheinlich etwas spröde. Die folgenden Beispiele zeigen einige Vorteile dieser Funktion bei der täglichen Arbeit mit der C-Shell.

Häufig wird eine Datei in ein Verzeichnis verschoben und unmittelbar anschließend das aktuelle Verzeichnis dorthin gewechselt.

$ mv broo.fazz.tar.gz /ftp/pub/comp/i386/Linux/utils/misc
$ cd !$
$ _
Mit ` !$' wird das letzte Wort der vorhergehenden Kommandozeile eingefügt. Das gleiche Ergebnis wird auch durch die META -.- Funktion des Kommandozeileneditors ausgeführt.

Gelegentlich braucht man nicht das komplette Argument, sondern nur einen Teil davon:

$ less /usr/X386/include/X11/Xaw/SmeBSBP.h
$ find /usr/src/X11 -name !:t
find /usr/src/X11 -name SmeBSBP.h
find: /usr/src/X11: No such file or directory
$ _
Der Operator !:t liefert SmeBSBP.h. Hier kann die Referenz auf das letzte Argument weggelassen werden, weil die :t-Operation nur die Zeichen nach dem letzten Slash liefert.

Sehr nützlich ist auch die schnelle Substitution einer Zeichenfolge:

$ tar tvfz /ftp/pub/Incoming/das.ist.neu.tar.gz
[Ausgabe von tar]
$ ^tv^x
tar xfz /ftp/pub/Incoming/das.ist.neu.tar.gz
$ _
Hier werden die tar-Optionen tv durch x ausgetauscht. Zuerst wird also der Inhalt des Archivs angezeigt, dann wird es im nächsten Schritt ausgepackt. Mit dieser Methode lassen sich ebenso leicht Tippfehler in der letzten Kommandozeile verbessern.  



next up previous contents index
Next: Anpassung des Kommandozeileneditors Up: bash Previous: Der Kommandozeileneditor



Linux Anwenderhandbuch -- Copyright 1993, 1994, 1995 S. Hetze, D. Hohndel, O. Kirch, M. Müller