Ein Überblick
Der erste Kontakt mit einer Shell ist häufig ernüchternd: Sie haben ein Terminal gestartet und sehen (fast) nichts, nur einen Prompt. Das soll die hoch gelobte Shell sein?
In diesen und den folgenden Beispielen verwenden wir "$>" als Prompt. Bei Ihnen kann das – abhängig von der Konfiguration Ihrer Shell – etwas anders aussehen, z. B. so (oder noch ganz anders):
Wie man den Prompt ändert, verraten wir Ihnen in einem der folgenden Teile. Der Prompt wird im Deutschen als "Eingabeaufforderung" bezeichnet (bleiben wir lieber beim englischen Begriff) und signalisiert dem Anwender, dass er nun seine Befehle eingeben kann.
Eine Befehlszeile ist dabei etwa in der folgenden Weise aufgebaut:
Prompt Befehl Argumente und Optionen
Der genaue Aufbau einer Befehlszeile ergibt sich aus vielen Faktoren, die wir in den nächsten Teilen besprechen werden. Unter anderem spielt der angegebene Befehl eine Hauptrolle. Er bestimmt, welche Argumente und Optionen verwendet werden können. Befehlszeilen beginnen immer mit einem Befehlsnamen (oder einem Shell-abhängigen Spezialzeichen), der normalerweise direkt angegeben wird, oder mit seinem Pfad, falls es sich um einen externen Befehl handelt, der nicht im Suchpfad der Shell liegt.
Hardcore-Linux?
Die Artikel dieser Serie verlangen Ihnen mehr ab als die übrigen LinuxUser-Texte. Auch wenn Sie die Informationen teilweise unverständlich finden, sollten Sie sich davon nicht abschrecken lassen. Anhand der Beispiele können Sie die einzelnen Features der Shell ausprobieren und so einiges über den Umgang mit der Befehlszeile lernen.
Bearbeiten von Befehlszeilen
Befehlszeilen können editiert werden, solange sie nicht mit [Return] an die Shell übergeben wurden. Bis zu diesem Zeitpunkt handelt es sich quasi um eine normale Textzeile, wie sie auch in einen Editor eingegeben werden könnte. Dem Anwender stehen in der Eingabezeile eine Reihe von Editierfunktionen zur Verfügung, die durch verschiedene Tastenkombinationen aufgerufen werden.
Innerhalb einer Befehlszeile kann der Anwender mit den normalen Tasten arbeiten, vorausgesetzt sein Terminal und die Shell sind korrekt konfiguriert. [Pos1] lässt den Cursor an den Anfang der Befehlszeile springen, [Ende] an deren Ende. In der Bash können diese Aktionen auch durch [Strg+A] bzw. [Strg+E] ausgeführt werden. Hier zeigt sich ein grundlegendes Konzept der Bash: Die einzelnen Tastendrücke werden mit speziellen Funktionen verknüpft – "gebunden" heißt das im Fachjargon.
Die Bash verwendet die Funktionen der Readline-Library zur Bearbeitung der Befehlszeile. Die Funktion beginning-of-line ist an [Strg+A] gebunden, end-of-line an [Strg+E]. Diese Bindungen lassen sich auch vom Anwender verändern, siehe unten. Die Cursortasten [<--] und [-->] verschieben die Schreibmarke um jeweils eine Position. Das geht auch, wenn keine Cursortasten zur Verfügung stehen: [Strg+F] (forward-char) und [Strg+B] (backward-char) bewegen den Cursor. Auch wortweise kann der Cursor versetzt werden: [Meta+F] springt mit der Funktion forward-word nach rechts, [Meta+B] (backward-word) nach links. Da die meisten Tastaturen über keine "Meta"-Taste verfügen, emuliert Linux deren Funktion. Zum einen wird die linke Alt-Taste [Alt] als Meta-Taste belegt, zum anderen kann die Escape-Taste vor einer Meta-Tastenkombination betätigt werden. Also: die an [Meta+B] gebundene Funktion kann als [Alt+B] oder durch [Esc] mit anschließendem [B] ausgeführt werden.
Die [Einfg]-Taste sollte eigentlich den Überschreibmodus aktivieren, dies ist aber bei den wenigsten Terminals möglich. Meistens fügt diese Taste die zuletzt ausgeschnittene Textpassage links vom Cursor ein oder hat einfach gar keine Funktion. Dafür wird mit der [Entf]-Taste in den meisten Systemen das Zeichen unter dem Cursor oder links davon gelöscht.
Entsprechendes gilt für die [Backspace]- (Rückschritt-) Taste oben rechts über der Return-Taste. Welche Aktion diese Taste auslöst, kann der Anwender unter X im Terminalemulator meistens einstellen. Beim klassischen xterm entscheidet die Einstellung der Ressource backarrowKeyIsErase über deren Funktion. Einfacher ist die Einstellung bei den KDE-Terminals vom Typ kvt vorzunehmen: Dort kann mit dem Menüpunkt Terminal ein kleines Dialogfenster geöffnet werden, in dem verschiedene Einstellungen möglich sind.
Die Bash stellt Ihnen natürlich noch viel mehr Funktionen zur Verfügung: Sie können beispielsweise mit der an [Meta+Backspace] gebundenen Funktion das Wort links vom Cursor löschen und es später mittels [Strg+Y] (yank) erneut in die Befehlszeile einfügen. Das Löschen von Bereichen ist noch allgemeiner: mit [Strg+Leerzeichen] definieren Sie den Anfang eines Bereichs, setzen den Cursor auf das Ende des Bereichs und löschen den Text dazwischen mittels [Strg+W] (kill-region). Ein Beispiel verdeutlicht dies:
$> dd if=/dev/urandom of=del1 count=3
Am Ende dieser Befehlszeile bemerkt der Anwender, dass er statt Daten aus dem Gerät urandom vielleicht doch lieber welche aus zero verwenden will. Er kann nun mittels backward-word dreimal nach links springen und landet dann auf dem "o" von "of".
Mit der Tastenkombination [Meta+Backspace] entfernt er das falsche Wort urandom und gibt stattdessen zero ein. Dabei ist es ausreichend, wenn er ze gefolgt von der Tabulatortaste eintippt – die Bash komplettiert diese Angabe.
Durch das Return wird die geänderte Zeile ausgeführt. Die dabei ausgeführte Funktion heißt accept-line und ist neben [Return] ebenfalls an [Strg+J] und [Strg+M] gebunden. Auch das Löschen ab der Cursor-Position bis zum Zeilenende ist mit [Strg+K] (kill-line) vorgesehen, umgekehrt: Löschen bis zum Zeilenanfang erfolgt durch [Strg+U] (unix-line-discard).
Auf zwei Besonderheiten beim Editieren der Befehlszeile sollten wir noch hinweisen: Es gibt die Möglichkeit, in einer Befehlszeile mehr als eine Textpassage auszuschneiden. Alle ausgeschnittenen Passagen werden der Reihe nach in einem speziellen Speicher zwischengespeichert, dem kill-ring, siehe Abbildung 1. Jeweils die zuletzt gespeicherte Passage wird durch einen yank-Befehl ([Strg+Y]) vor der Cursor-Position eingefügt. Es besteht mittels [Meta+Y] die Möglichkeit, den kill-ring um eine Position zu rotieren, so dass die zuvor ausgeschnittene Passage eingefügt wird.
$> mv /etc/inputrc /etc/inputrc.system
inputrc.system wird ausgeschnitten (z. B. mit [Meta+Backspace]), anschließend wird inputrc ausgeschnitten …
$> cp /etc/inputrc.system
der zuerst ausgeschnittene Text wird mit [Strg+Y] eingefügt …
$> cp /etc/inputrc.system ~/.inputrc
[Meta+y] rotiert den kill-ring, und der zuletzt ausgeschnittene Text wird eingefügt.
So könnten also beispielsweise auch die Angaben einer Eingabedatei mit einer Ausgabedatei vertauscht werden. Der kill-ring-Speicher verfügt normalerweise über 30 Speicherplätze. Werden mehr Textpassagen ausgeschnitten, verschwinden die zuerst in den Speicher aufgenommenen. Zu einer Passage zählen alle nacheinander mittels einer der kill-Funktionen (kill-line, kill-region, kill-whole-line, kill-word, forward-/backward-kill-word, unix-line-discard und unix-word-rubout, nicht aber forward-backward-delete-char) gelöschten Texte, wenn keine anderen Funktionen zwischenzeitig ausgeführt wurden. Das Bewegen des Cursors mit den Cursortasten beispielsweise reicht aus, um eine kill-Aktion zu beenden. Wenn alles schief geht, gibt es eine Undo-Funktion für die Befehlszeile, die es ermöglicht, alle Änderungen schrittweise in umgekehrter Reihenfolge zurückzunehmen. Die Funktion undo ist, wie unten gezeigt wird, normalerweise an die Tastenkombination [Strg+Shift+-] (also: Strg, Shift und -) gebunden.
Alle Änderungen in der Befehlszeile können auch in einem Schritt revidiert werden, dies ist durchrevert-line – gebunden an [Meta+R] oder [Strg+Meta+R] möglich.



