next up previous contents index
Next: cat Up: Von GNU's, Muscheln und Previous: basename

Subsections


bash

    

Funktion

bash - die Wiedergeburtsmuschel. Stark entwickelter Nachfahre eines unsterblichen Wesens aus dem Unix (Kreidezeit).

Syntax

bash [Optionen] [Datei]

Beschreibung

In der Computersteinzeit wurden Programme in Lochkarten gestanzt und zusammen mit den Daten in mechanische Kartenleser gepackt. Die Auswahl zwischen den möglichen Programmen fand also nicht an einer Systemconsole, sondern vor den Regalen des Kartenarchivs statt. Heute sind die Programme und die Daten auf magnetischen Datenträgern gespeichert. Die Festplatte einer durchschnittlichen Linux-Installation bietet mindestens 300 verschiedene Programme zur Auswahl.

Die Frage, wie die Auswahl eines konkreten Programms stattfindet, ist ebenso trivial wie bodenlos tiefgründig. Die Antwort ist ein Metaprogramm, das automatisch geladen wird und dessen Hauptaufgabe es ist, weitere Programme zu laden. Unter UNIX und seinen Verwandten wird so ein Programm als Shell bezeichnet. Sie hat, im Gegensatz zu vielen vergleichbaren Programmen anderer Betriebssysteme, den Status eines Benutzerprogramms und kann deshalb nach Belieben ausgetauscht werden.[*]

An der Benutzeroberfläche entfesselt sich leicht eine Art Glaubenskrieg zwischen den Protagonisten unterschiedlicher Modelle. Zwischen den grafischen (mausgesteuerten, bildschirmorientierten) und den textuellen (tastaturgesteuerten, zeilenorientierten) Benutzeroberflächen scheinen sich die Geister zu scheiden. Die Vorteile der grafischen Benutzerführung liegt vor allem in ihrer leichten Erlernbarkeit. Durch die Präsentation der möglichen Aktionen in Menüs kann der ungeübte Benutzer intuitiv den Weg zu seiner Problemlösung finden. Zeilenorientierte Oberflächen, sogenannte Kommandozeileninterpreter, haben ihren Vorteil in der Vielseitigkeit. Während in einem Menüsystem zwangsläufig nur die Funktionen zu erreichen sind, für die es Menüeinträge gibt, können im Kommandozeileninterpreter alle Kommandos mit allen zulässigen Optionen aufgerufen werden. Genau diese Vielseitigkeit macht den Kommandozeileninterpreter - die Shell - zu einem unverzichtbaren Werkzeug der Systemverwalterin, das auch in kommerziellen Systemen mit menügesteuerter Administratorshell nicht ersetzt werden kann.

Die ,,Standardshell`` von AT&T Unix ist die nach ihrem Entwickler Steven R. Bourne benannte Shell (die unter der Kommandobezeichnung sh aufgerufen wird). Neben ihren Diensten als interaktiver Kommandozeileninterpreter bietet die Bourne-Shell noch eine mächtige Sprache zum Erstellen von Shellprogrammen. Solche Shellscripts  erlauben schnell und unkompliziert die Zusammenfassung immer wiederkehrender Kommandofolgen als Batchdatei. Die Möglichkeiten der Shellprogrammierung gehen aber noch viel weiter, wie die weiter hinten folgende Beschreibung zeigen wird.

Neben der ,,alten`` Bourne-Shell gibt es noch eine ganze Reihe weiterer Shells. Andere bekannte Shells sind die an der Berkeley Universität entwickelte csh und die nach ihrem Entwickler David Korn benannte Shell ksh. Die Shells unterscheiden sich vor allem in den Shellsprachen, sie haben aber auch neue Eigenschaften zur Erleichterung der interaktiven Benutzung als Kommandozeileninterpreter. Die ,,Bourne Again Shell`` bash vereint die altbekannte und bewährte Shellsprache der Bourne Shell mit den fortschrittlichen und beliebten Interaktionsfunktionen der anderen Shells. Die bash ist als Standardshell in allen Linux-Distributionen enthalten.

Es ist erklärter Anspruch der bash, zur Standard-Bourne-Shell kompatibel zu sein, und Ziel ist die volle Übereinstimmung mit dem POSIX-1003.2-Standard. Die Kompatibilität zur Bourne-Shell ist besonders wichtig, um die vielen Shellscripts für diese Standardshell auch mit der bash benutzen zu können.

Interaktive Shell und Shellprogrammierung

 

Die alltägliche Arbeit mit der Shell findet interaktiv statt. Das heißt, die Shell gibt eine Eingabeaufforderung (Prompt) aus, die vom Benutzer mit einer Folge von Tastatureingaben, der Kommandozeile, beantwortet wird. Eine Kommandozeile wird durch ein Zeilenendezeichen (RETURN) abgeschlossen. Die Shell interpretiert daraufhin die eingegebene Zeile und führt die gegebenenfalls darin formulierten Kommandos aus. Normalerweise gibt die Shell nach der vollständigen Bearbeitung der Kommandozeile wieder eine Eingabeaufforderung aus, um den gleichen Vorgang erneut einzuleiten.

Für die Shell macht es wenig Unterschied, ob sie eine Kommandozeile direkt von der Tastatur liest, oder ob sie die gleiche Zeile aus einem ,,eingefrorenen Datenstrom``, einer Datei, erhält. Für den Anwender ist es enorm praktisch, immer wiederkehrende Kommandofolgen in einer Textdatei zusammenzufassen und dann diese Datei anstelle der Tastatureingabe bearbeiten zu lassen. Genau das ist der Ursprung der Shellprogrammierung.

In der Realität bieten alle Unix-Shells Programmiersprachen, die weit über diese Stapelverarbeitung  (sogenannte Batch-Jobs)  hinausgehen. Es können Variable benutzt werden, Verzweigungen und Schleifen sind möglich, es können sogar Script-Funktionen definiert werden, die eine strukturierte Programmierung wie in den bekannten Hochsprachen erlauben.  

Nun besteht umgekehrt kein vernünftiger Grund, weshalb die Elemente der Shellprogrammierung nicht auch auf der Kommandozeile verwendet werden sollten. Natürlich wird niemand ein zig-zeiliges Shellprogramm direkt auf der Kommandozeile eingeben. Andererseits macht es wenig Sinn, für jede vierzeilige for-Schleife ein Shellscript zu schreiben.

Damit wird klar, daß die Grenzen zwischen interaktiver Benutzung und Shellprogrammierung fließend sind. Je nach Blickwinkel werden aber die Schwerpunkte anders gesetzt. Diese Beschreibung richtet sich in erster Linie an interaktive Benutzer. Sie erhebt aber auch den Anspruch auf Vollständigkeit. Um den Text einigermaßen lesbar zu machen, sind die Abschnitte mit ausgesprochen shellscriptspezifischen Inhalten in einem kleineren Schriftgrad gedruckt. Solche Textteile können beim ersten Lesen übersprungen werden.

Der Kommandozeileneditor

   Alle Tastatureingaben, die zeilenweise erfolgen, können mit bestimmten Steuerzeichen ,,editiert`` werden. Mit dem Steuerzeichen CONTROL-U wird normalerweise die komplette Zeile gelöscht, CONTROL-C bricht die Eingabe ab, CONTROL-D[*] steht für das Dateiende (EOF, End Of File), also für das Ende der interaktiven Eingabe insgesamt, CONTROL-H oder BACKSPACE löscht das letzte Zeichen.

Diese primitiven Funktionen werden vom Terminaltreiber des Kernels im ,,cooked``-Modus direkt angeboten. Die bash bietet darüber hinaus einen Kommandozeileneditor, der in Umfang und Funktion den Standardeditoren vi und emacs nachempfunden ist.[*] Sie können die Funktionen des Kommandozeileneditors Ihren eigenen Bedürfnissen anpassen. Zwischen den Standardbelegungen kann mit dem set-Shellkommando umgeschaltet werden. Normalerweise arbeitet der Kommandozeileneditor im emacs-Modus.

  Die Editorbefehle im emacs-Modus benutzen zwei Sondertasten: die CONTROL- und die Metataste. Die CONTROL-Taste ist auf der PC-Tastatur in der linken unteren Ecke (manchmal STRG). Eine Metataste ist unter diesem Namen in der Regel nicht vorhanden. Meistens wird die linke ALT-Taste mit dieser Funktion belegt. Wenn das nicht der Fall ist, kann die ESCAPE-Taste (ESC) benutzt werden. Während CONTROL und ALT gemeinsam mit dem Buchstaben gedrückt werden müssen, wird ESC vor dem Buchstaben gedrückt (zwei Anschläge).[*]

In den Erklärungen wird CONTROL mit `C-' und die Metataste mit `M-' gekennzeichnet. In manchen Fällen müssen CONTROL und ALT zusammen gedrückt werden, das wird dann durch M-C- symbolisiert.

Positionieren der Einfügemarke

Zeilenanfang (C-a)
setzt die Einfügemarke an den Anfang der Kommandozeile.
(beginning-of-line)
Zeilenende (C-e)
setzt die Einfügemarke an das Ende der Kommandozeile. (end-of-line)
Zeichen vorwärts (C-f)
setzt die Einfügemarke ein Zeichen nach rechts. Diese Funktion ist auch mit der rechten Pfeiltaste im Cursorblock erreichbar. (forward-char)
Zeichen rückwärts (C-b)
setzt die Einfügemarke ein Zeichen nach links. Diese Funktion ist auch mit der linken Pfeiltaste im Cursorblock erreichbar. (backward-char)
Wort vorwärts (M-f)
setzt die Einfügemarke an das Ende des aktuellen Wortes oder ein Wort weiter (wenn die Einfügemarke zwischen zwei Wörtern steht). (forward-word)
Wort rückwärts (M-b)
setzt die Einfügemarke an den Anfang des aktuellen Wortes oder des vorhergehenden Wortes (wenn die Einfügemarke zwischen zwei Wörtern steht). (backward-word)
Bildschirm löschen (C-l)
löscht alle Zeichen vom Bildschirm. Die Einfügemarke erscheint danach auf der ersten Zeile. (clear-screen)

Automatische Erweiterung von Kommando- und Dateinamen 

erweitern (TAB)
  versucht die bis zu diesem Editorbefehl geschriebene Kommandozeile sinnvoll zu ergänzen. Das geschieht, indem die Zeichenfolge des letzten Wortes bis zur Einfügemarke mit den Namen von Kommandos, Dateien und Verzeichnissen verglichen und das Wort so weit ergänzt wird, wie eine eindeutige Zuordnung möglich ist. Das erste Wort eines einfachen Kommandos wird dabei nur mit den Kommandonamen in den PATH-Verzeichnissen verglichen, die   weiteren Wörter eines einfachen Kommandos werden dagegen nur noch mit Datei- und Verzeichnisnamen im aktuellen Verzeichnis (Arbeitsverzeichnis) verglichen. In einigen Fällen (z. B. bei Pipelines) werden auch die ersten Wörter der folgenden Kommandos auf diese Weise richtig zugeordnet.

Probieren Sie diese Funktion des Kommandozeileneditors einfach aus. Sie werden schnell merken, wie mächtig und vielseitig sie ist.

Wenn ein Wort mehreren bekannten Namen zugeordnet werden kann, wird es nur so weit ergänzt, wie sich die Namen nicht unterscheiden. Wenn dann ein zweites Mal TAB gedrückt wird, werden alle erkannten Möglichkeiten angezeigt.[*] (complete)

mögliche Erweiterungen (M-?)
zeigt alle als sinnvoll erkannten Erweiterungen an. Als sinnvoll gilt hier wieder ein Kommandoname als erstes Wort eines einfachen Kommandos und ein Datei- oder Verzeichnisname für jedes weitere Wort. (possible-completions)
nur Kommandoerweiterung (M-!)
versucht, das Wort vor dem Cursor zu einem Kommandonamen zu erweitern. (complete-command)
mögliche Kommandoerweiterungen (C-x !)
gibt eine Liste aller als mögliche Erweiterungen für das Wort vor der Einfügemarke in Frage kommenden Kommandonamen aus. (possible-command-completions)
nur Dateinamenerweiterung (M-/)
vergleicht das Wort bis zum Cursor nur mit Datei- und Verzeichnisnamen. Werden passende Namen gefunden, findet eine Erweiterung wie beim TAB- Editorkommando statt. (complete-filename)
mögliche Dateinamen (C-x /)
zeigt alle als sinnvoll erkannten Datei- und Verzeichnisnamen, ohne eine Erweiterung auszuführen. (possible-filename-completions)
Benutzernamenerweiterung (M-~)
versucht, das Wort bis zur Einfügemarke zu einem Benutzernamen zu erweitern. (complete-username)
mögliche Benutzernamen (C-x ~)
zeigt alle möglichen Benutzernamen, auf die das Wort bis zur Einfügemarke paßt. (possible-username-completions)
Variablenerweiterung (M-$)
versucht, das Wort bis zur Einfügemarke zu einem Variablennamen zu erweitern. (complete-variable)
mögliche Variable (C-x $)
zeigt alle möglichen Variablennamen an, auf die das Wort bis zur Einfügemarke paßt. (possible-variable-completion)
nur Hostnamenerweiterung (M-@)
erweitert das Wort unter der Einfügemarke zu einem Hostnamen. Dieser Name wird aus der Datei /etc/hosts genommen, wenn in der Shellvariablen hostname_completion_file keine andere Datei angegeben ist. (complete-hostname)
mögliche Hostnamen (C-x @)
zeigt alle möglichen Erweiterungen für den Hostnamen. (possible-hostname-completions)
Erweiterung aus der History (M-TAB)
versucht, das Wort vor dem Cursor aus dem Historyspeicher zu ergänzen. (dynamic-complete-history)
Erweiterung in Klammern (M-{)
schließt die Liste der möglichen Dateinamenerweiterungen in Klammern ein, so daß die Shell sie zu einer Liste dieser Namen erweitern kann. (complete-into-braces)
Änderungen des Textes
Zeichen löschen (C-d)
löscht das Zeichen unter dem Cursor. Wenn CONTROL-d als erstes Zeichen einer leeren Kommandozeile eingegeben wird, erzeugt diese Tastenkombination ein EOF-Zeichen für das Ende der interaktiven Eingabe.[*] (delete-char)
letztes Zeichen löschen (BACKSPACE)
löscht das Zeichen vor dem Cursor. (backward-delete-char)
wörtlich einfügen (C-q, C-v)
wird benutzt um CONTROL-Zeichen in die Kommandozeile zu schreiben, die normalerweise durch den Editor abgefangen und bearbeitet werden. (quoted-insert)
Tabulator einfügen (M-TAB)
schreibt ein TAB in die Kommandozeile. (tab-insert)
Text einfügen (a, b, A, 1, ?, ...)
schreibt die Tastatursymbole (Buchstaben) in die Kommandozeile, wie sie von der Tastatur gelesen werden. Hinter dieser etwas verklausulierten Formulierung verbirgt sich die Eingabe eines normalen Buchstabens. (self-insert)
zwei Zeichen vertauschen (C-t)
vertauscht das Zeichen vor der Einfügemarke mit dem Zeichen unter der Einfügemarke. Die Einfügemarke wandert außerdem um eine Stelle weiter. Wenn die Einfügemarke am Zeilenende angekommen ist, werden die beiden Zeichen vor der Einfügemarke vertauscht. (transpose-chars)
zwei Wörter vertauschen (M-t)
vertauscht das Wort unter der Einfügemarke mit dem Wort vor der Einfügemarke bzw. das Wort nach der Einfügemarke mit dem Wort vor der Einfügemarke. Die Einfügemarke steht danach hinter dem letzten der vertauschten Wörter. Wenn die Einfügemarke bereits am Ende der Kommandozeile steht, werden die beiden Wörter vor der Einfügemarke vertauscht. (transpose-words)
GROSSBUCHSTABEN (M-u)
wandelt alle Buchstaben des Wortes von der Einfügemarke an in Großbuchstaben um. (upcase-word)
kleinbuchstaben (M-l)
wandelt alle Buchstaben des Wortes von der Einfügemarke an in Kleinbuchstaben um. (downcase-word)
Großschreibung (M-c)
wandelt den Buchstaben unter der Einfügemarke oder den ersten Buchstaben des folgenden Wortes in Großbuchstaben um, die folgenden Buchstaben bis zum Wortende alle in Kleinbuchstaben. Anschließend steht die Einfügemarke hinter dem umgewandelten Wort. (capitalize-word)
Ausschneiden und Einfügen
bis zum Zeilenende ausschneiden (C-k)
löscht die restliche Kommandozeile von der Einfügemarke an und speichert sie im Ausschneide-Ringspeicher. (kill-line)
vom Zeilenanfang ausschneiden (normalerweise ohne Belegung)
schneidet den Anfang der Kommandozeile bis zur Einfügemarke aus. Dieses Kommando ist normalerweise nicht mit einer Tastenkombination verbunden. (backward-kill-line)
Rest des Wortes ausschneiden (M-d)
schneidet von der Einfügemarke an ein Wort aus und speichert es im Ringspeicher. Als Wort werden hier alle Zeichen von der Einfügemarke an bis zum nächsten Sonderzeichen betrachtet. Eine beliebig lange Folge von Sonderzeichen unter oder unmittelbar nach der Einfügemarke wird nicht als Worttrenner behandelt. (kill-word)
Anfang des Wortes ausschneiden (M-BACKSPACE)
schneidet alle Zeichen vor der Einfügemarke bis zum nächsten Sonderzeichen aus und speichert sie im Ringspeicher. Das Zeichen unter der Einfügemarke wird nicht ausgeschnitten. Eine beliebig lange Folge von Sonderzeichen unmittelbar vor der Einfügemarke wird nicht als Worttrenner behandelt. (backward-kill-word)

vom Zeilenanfang bis zur Einfügemarke ausschneiden (C-u)
schneidet den Anfang der Kommandozeile bis zur Einfügemarke aus und speichert ihn im Ringspeicher. Das Zeichen unter der Einfügemarke wird nicht ausgeschnitten. (unix-line-discard)
Anfang des Wortes ausschneiden (C-w)
schneidet alle Zeichen vor der Einfügemarke bis zum nächsten Leerzeichen aus und speichert sie im Ringspeicher. (unix-word-rubout)
ausgeschnittenes Stück einfügen (C-y)
fügt das zuletzt in den Ausschneide-Ringspeicher geschriebene Stück vor der Einfügemarke ein. Das Stück wird dabei aus dem Ringspeicher entfernt. (yank)
Ausschneide-Ringspeicher rotieren (M-y)
ersetzt das zuletzt eingefügte Stück durch das vor diesem Stück in den Ringspeicher eingefügte Stück der Kommandozeile. Das zuvor ersetzte Stück wird wieder in den Ringspeicher eingefügt, das aktuell ersetzte Stück daraus entfernt. (yank-pop)
Argumente
numerisches Argument (M-0, M-1, ... , M--)
wird als numerisches Argument für das folgende Editorkommando benutzt. In der Regel wird durch dieses Argument die Anzahl der Wiederholungen dieses Editorkommandos bestimmt. (digit-argument)
universelles Argument (nicht Belegt)
entspricht dem gleichnamigen Tastaturbefehl vom emacs-Editor. Es ist allerdings keiner Tastenkombination zugeordnet. (universal-argument)

Verschiedenes

einlesen der Initdatei (C-x C-r)
veranlaßt die Shell, die .inputrc-Datei neu einzulesen. (re-read-init-file)
Metazeichen (ESC)
veranlaßt die Shell, das nächste Zeichen als Metazeichen zu interpretieren. Wichtig, wenn keine Metataste auf der Tastatur ausgewiesen ist: bei einer PC-Tastatur ist meist die linke ALT-Taste mit der Metafunktion belegt! (prefix-meta)
Kommando zurück (C-_)
nimmt das zuletzt ausgeführte Editorkommando zurück. Es werden alle für eine Kommandozeile gegebenen Editorkommandos gespeichert und sind auf diese Weise nacheinander reversibel. (undo)
alles zurück (M-r)
stellt den ursprünglichen Zustand der Kommandozeile wieder her, nimmt also alle Editorkommandos zurück. (revert-line)
emacs Modus (C-e)
schaltet aus dem vi-Modus in den emacs-Modus. (emacs-editing-mode)
 

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 hier 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.[*] 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.[*] 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 Shellutility dirname 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 Shellutility basename 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 -tvzf /ftp/pub/Incoming/das.ist.neu.tar.gz
[Ausgabe von tar]
$ ^tv^x
tar -xzf /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.  

Anpassung des Kommandozeileneditors

  Der Kommandozeileneditor der bash benutzt die GNU-readline  Bibliotheksfunktionen. Wie bereits gesagt, bietet readline zwei Standardbelegungen an, zwischen denen Sie mit dem set-Shellkommando hin und her schalten können.

Die Zuordnung von Tastenkombinationen zu bestimmten Editorfunktionen kann aber noch weiter Ihren speziellen Bedürfnissen angepaßt werden. Sie können jede Editorfunktion mit einer frei wählbaren Tastenkombination verknüpfen. Diese Um- bzw. Neubelegung der Tasten kann zur Laufzeit mit dem bind-Shellkommando durchgeführt werden. 

Das Format einer Tastaturbelegung sieht folgendermaßen aus:

Taste:Kommandobezeichnung

Die Kommandobezeichnungen sind in Klammern hinter den Beschreibungen der Editorfunktionen auf den vorhergehenden Seiten angegeben.

Für die Tastenkombinationen können die Konstruktionen `\C-' für die Kombination mit CONTROL und `\e-' oder `\M-' für die Metakombinationen mit ESC oder ALT verwendet werden. Außerdem können die folgenden Tasten benannt werden:

RUBOUT für Backspace
DEL für Delete
ESC für Escape
SPACE oder SPC für Leerzeichen
RETURN, RET, NEWLINE oder LFD für Zeilenende
TAB für Tabulator

Wenn Sie z. B. anstelle des aufwendigen set-Kommandos die Tastenkombination CONTROL-x v zum Umschalten in den vi-Modus und die Kombination CONTROL-x e zum Zurückschalten in den EMACS-Modus verwenden wollen, erreichen Sie das mit den folgenden Kommandos:
$ bind -m emacs '"\C-xv":vi-editing-mode'
$ bind -m vi '"\C-xe":emacs-editing-mode'
$ bind -m vi-insert '"\C-xe":emacs-editing-mode'
$ _

Neben den Editorkommandos können auch Zeichenketten und Kommandokombinationen (Makros) auf bestimmte Tasten gelegt werden.

Beispielsweise können Sie mit dem folgenden Kommando ein Makro zum Editieren der PATH-Variablen im emacs-Modus installieren:

$ bind -m emacs '"\C-xp":"PATH=${PATH}\e\C-e\C-a\ef\C-f"'
$ _

  

Es ist auch möglich, eine neue Tastaturbelegung dauerhaft einzurichten, indem die Zuordnung von Kommandos und Tastenkombinationen in einer Datei abgespeichert wird.[*]

Den Namen dieser Datei können Sie in der Shellvariablen INPUTRC festlegen. Wenn diese Variable nicht existiert, wird die Belegung aus der Datei ~/.inputrc gelesen.

Für jede Umbelegung muß eine Zeile in der Datei eingetragen werden. Format und Inhalt der Zeilen stimmen mit dem oben für bind beschriebenen überein.

Zusätzlich können zur Anpassung von readline einige Schalter gesetzt und Variable belegt werden. Sie werden in der Form

set Schalter Wert

in der .inputrc-Datei eingetragen. Die Schalter können auch mit dem bind-Kommando benutzt werden. Die Werte in Klammern stellen die Voreinstellung dar.

bell-style
(audible) regelt das Verhalten von readline, wenn dem Benutzer ein Signal gegeben werden soll. Außer audible sind none und visible möglich.
comment-begin
(`#') In dieser Variablen kann das Zeichen bestimmt werden, das durch das vi-comment-Kommando in die erste Spalte der Kommandozeile geschrieben wird. Durch das Nummernzeichen (Voreinstellung) wird die Ausführung der Zeile unterdrückt.
completion-query-items
(100) In dieser Variablen kann eine Anzahl bestimmt werden, bis zu der mögliche Erweiterungen ohne Nachfrage angezeigt werden. 
convert-meta
(On) Bleibt dieser Schalter gesetzt, werden Zeichen mit gesetztem achten Bit zu einer ESC-Sequenz mit dem entsprechenden ASCII-Zeichen verarbeitet.
disable-completion
(Off) Das Setzen dieses Schalters unterdrückt die Kommandozeilenerweiterung.
editing-mode
(emacs) Durch Belegen dieser Variablen mit ,,vi`` wird die vi-Tastaturbelegung eingeschaltet. Einzige Alternative ist der voreingestellte emacs-Modus.
enable-keypad
(Off) Wenn dieser Schalter auf ``On'' gesetzt wird, versucht readline den Ziffernblock zu aktivieren.
expand-tilde
(Off) Wenn der Schalter eingeschaltet wird, führt readline eine Tildenerweiterung bereits beim Versuch einer Kommandozeilenkomplettierung aus.
horizontal-scroll-mode
(Off) Wird dieser Schalter auf ,,On`` gesetzt, so wird beim Schreiben der Kommandozeile über den rechten Bildschirmrand hinaus die Zeile nach links verschoben, ansonsten wird sie umgebrochen.
input-meta
(Off) Wenn dieser Schalter ,,On`` gesetzt wird, erlaubt die Shell die Eingabe von 8-Bit-Zeichen (zum Beispiel Umlaute) auf der Kommandozeile.
keymap
(emacs) Diese Variable stellt die Tastaturtabelle für readline ein. Gültige Werte sind emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-standard, vi-command oder vi-insert. vi ist äquivalent zu vi-command und emacs entspricht emacs-standard.
mark-directories
(On) Solange der Schalter auf ``On'' bleibt, wird bei der Kommandozeilenerweiterung ein / an einen Verzeichnisnamen angehängt.
mark-modified-lines
(Off) Wird dieser Schalter ,,On`` gesetzt, werden alle Zeilen in der history mit einem Asterisk `*' gekennzeichnet, die im Editor verändert wurden.
meta-flag
(Off) entspricht dem Schalter input-meta.
output-meta
(Off) Wenn dieser Schalter ,,On`` gesetzt wird, zeigt die bash auf der Kommandozeile 8-Bit-Zeichen an.
show-all-if-ambigous
(Off) Die Veränderung dieses Schalters auf ``On'' veranlaßt readline, bei Komplettierungsversuchen mit mehreren Möglichkeiten sofort alle Varianten anzuzeigen, anstatt ein Signal zu geben.
visible-stats
(Off) Wenn dieser Schalter auf ``On'' gesetzt wird, erscheinen bei der Liste möglicher Erweiterungen die Symbole für die Dateitypen, wie sie auch von ls -F angezeigt werden.

Bedingte Ausführung von .inputrc

Ähnlich wie beim C-Präprozessor können Teile der .inputrc-Datei durch die Direktiven $if, $else und $endif eingeschlossen werden, um diese Einstellungen nur unter bestimmten Bedingungen auszuführen. Folgende Tests sind vorgesehen:

$if term=Terminal
testet auf die Übereinstimmung mit der TERM-Umgebungsvariablen.
$if bash
leitet den Teil von .inputrc ein, der speziell für die bash bestimmt ist. Andere Programme, die mit der readline-Library arbeiten, werden mit der selben .inputrc-Datei initialisiert.
$if mode=Modus
ermöglicht die Unterscheidung der verschiedenen Editiermodi: emacs, emacs-meta,emacs-ctlx, vi, vi-move und vi-insert.

Beispiel:

$if Bash
        # Umlaute in der Kommandozeile erlauben:
        set convert-meta Off
        set meta-flag On
        set output-meta On
        $if term=xterm
        # Spezielle Einstellungen fuer xterm
        $else
        # Einstellungen fuer alle anderen Terminals
        $endif
        $if mode=vi
        # Tastaturbelegung im vi-Modus
        $endif
        $if mode=emacs
        # Tastaturbelegung im emacs-Modus
        $endif
$endif

Eine ausführliche TEXinfo-Beschreibung aller readline-Funktionen kann mit dem info-Kommando nachgelesen werden.

Die aktuelle Tastaturbelegung wird mit dem Kommando `bind -v' ausgegeben.

 

Der erweiterte Editor: sekundärer Prompt

  Viele Operationen der Shell werden mit bestimmten Symbolen eingeleitet und müssen mit weiteren Symbolen abgeschlossen werden. Beispielsweise muß eine for-Schleife durch ein done abgeschlossen werden, eine (-Klammer durch eine ), eine mit Anführungszeichen begonnene Zeichenkette muß mit Anführungszeichen abgeschlossen werden und so weiter.

Die Shell unterstützt die Eingabe solcher Kommandos, indem sie nach einem Zeilenende in einer unvollständigen Kommandozeile eine neue Eingabeaufforderung - in der Regel ein >  - ausgibt, bis der erwartete Abschluß des begonnenen Kommandos eingegeben ist. Die so eingegebenen Teile werden zusammen als eine Kommandozeile interpretiert.

Wenn die Shelloption cmdhist gesetzt ist, wird ein aus mehreren Zeilen bestehendes Kommando als ein einziger Eintrag im History-Speicher behandelt. Vor bash Version 2.0 wurde dieses Feature durch die Shellvariable command_oriented_history gesteuert.

Interpretation der Kommandozeile

  Mit dem accept-line-Kommando (RETURN) im Editor ist der im eigentlichen Sinn interaktive Teil der Shellbenutzung zu Ende. Die folgende Interpretation der Zeile durch die Shell führt normalerweise zur Erzeugung eines neuen Prozesses, in dem das eben aufgerufene Programm abläuft. Bevor das geschieht, werden aber von der Shell selbst noch eine ganze Reihe von Veränderungen an der Zeile durchgeführt. Diese Interpretation findet bei der interaktiven Shell auf exakt die gleiche Weise statt wie im Shellprogramm.

Die Kommandozeile wird analysiert, indem sie anhand von ,,Trennzeichen`` in atomare Sinneinheiten (Wörter oder Token) geteilt wird. Dabei kann die gesamte Zeile in mehrere Kommandos zerfallen, die getrennt weiterverarbeitet werden.

Die Wörter der einzelnen Kommandos werden sequentiell (der Reihe nach) auf bestimmte Symbole oder Sonderzeichen durchsucht. Bestimmte Sonderzeichen führen zur Umlenkung der Ein- und Ausgabekanäle. Durch andere Symbole werden bestimmte Wörter verändert oder ersetzt. Dieser Vorgang wird als Parametersubstitution bezeichnet. Danach wird die Kommandozeile noch ,,aufgeräumt``. Abschließend werden die Programme (intern oder extern) lokalisiert und mit ihren Optionen und Argumenten aufgerufen.

Kommentare

   In Shellscripten können an beliebigen Stellen Kommentare durch ein Nummern- oder Hash-Zeichen `#' eingeleitet werden. Der gesamte Zeilenrest wird bei der Interpretation von der Shell ignoriert.

Im Unterschied zur Bourne-Shell bietet die interaktive bash diese Möglichkeit normalerweise nicht auf der Kommandozeile (wohl aber beim source-Shellkommando). Durch das Kommando set -o interactive-comments kann die Verwendung von Kommentaren in der interaktiven Shell ermöglicht werden.

Auf der Kommandozeile (wie auch im Shellscript) werden Zeilen, die mit einem Doppelpunkt beginnen, zwar der Parametererweiterung unterworfen, sie werden aber nicht ausgeführt.

Ein häufiger Spezialfall tritt auf, wenn auf ein Kommentarzeichen in der ersten Zeile ein Ausrufezeichen folgt und auf dem Rest der ersten Zeile ein Interpreterprogramm benannt ist. Wenn so eine Textdatei ausführbar ist und anstelle eines Kommandos aufgerufen wird, übergibt der Linux-Kernel die Textdatei direkt dem benannten Interpreterprogramm, ohne extra eine Shell aufzurufen. Natürlich kann auch eine Shell als Interpreterprogramm für ein Shellscript benannt werden. Das folgende Script ersetzt beispielsweise die fehlende pwd-Funktion der tcsh:

#!/bin/bash
IFS=" "
builtin pwd

Der Status

   

Jede Funktion und jedes Kommando kann eine einzige Zahl an die aufrufende Shell oder allgemeiner an das aufrufende Programm zurückgeben. Dieser Rückgabewert wird als Status bezeichnet.

Anders als z.B. in C-Funktionen gilt in der bash (wie auch in den anderen Shells) folgende Konvention:

In der Shell kann der Status des zuletzt ausgeführten Kommandos aus der Shellvariablen ? gelesen werden.

Häufig kann aus dem Statuswert auf die Art des Fehlers zurückgeschlossen werden. Wenn ein Kommando beispielsweise durch ein Signal beendet wurde, ist der Rückgabewert (Status) der Wert des Signals + 128.

Der Status kann in sein logisches Gegenteil verkehrt werden (0 oder 1), indem dem gesamten Kommando ein `! ' vorangestellt wird. Um diese Konstruktion von der History-Substitution im C-Shell-Stil zu unterscheiden, muß dem Ausrufezeichen unmittelbar ein Blank oder `(' folgen.

Shell Grammatik

 

Reservierte Wörter

Wie bei jeder anderen Programmiersprache gibt es für die Sprache zur Shellprogrammierung reservierte Wörter. Diese Wörter dürfen nicht für Variablennamen oder zum Benennen von Scriptfunktionen benutzt werden. Sie werden nur erkannt, wenn sie ohne Anführungszeichen und als erstes Wort eines einfachen Kommandos oder als drittes Wort eines case- oder for-Kommandos auftreten.

Folgende Wörter sind reserviert:
! case do done elif else esac fi for function if in select then time until while { }

Atome, Wörter, Token

 

Die ,,Atome`` einer Kommandozeile - auch als Wörter oder Token bezeichnet - werden anhand bestimmter Trennzeichen identifiziert. Die einfachste und natürliche Trennung zweier Wörter findet durch Leerzeichen statt. Dabei ist die Anzahl der Trennzeichen gleichgültig. Anstelle von Leerzeichen können auch TABs benutzt werden. Wegen ihrer offenkundigen Ähnlichkeit werden diese Trenner auch als Blanks bezeichnet. 

Die folgenden zur Shellprogrammierung verwendeten Sonderzeichen führen automatisch auch zur Trennung von Wörtern:

| & ; ( ) < > und das Zeilenende (RETURN)

Diese Zeichen haben in jedem Fall spezielle Aufgaben und können deshalb nicht einfach innerhalb von Argumenten an ein Kommando übergeben werden. Eine Reihe weiterer Zeichen werden nur in bestimmten Situationen als Operatoren erkannt. In diesen Fällen können auch sie nicht innerhalb von Argumenten an ein Kommando weitergegeben werden. Besondere Aufmerksamkeit ist bei den folgenden Zeichen geboten:

! * ? $ ` ' { } [ ] ^= # " \

Wenn eines der oben genannten (Sonder-) Zeichen als Argument an ein Kommando übergeben werden soll, muß es für die Shell ,,entwertet`` werden.

Kommandos - nicht unbedingt einfach

In einem Multitasking-Betriebssystem macht es durchaus Sinn, mehr als ein Kommando in einer Zeile aufzurufen. So ein zusammengesetztes Kommando besteht aus mehreren einfachen Kommandos. Zur Trennung von einfachen Kommandos werden Kontrolloperatoren verwendet, die aus den oben genannten Sonderzeichen zusammengesetzt sind:

| & || && ; ;; ( )

Außer mit dem eigentlichen Kommandonamen (dem Namen der ausführbaren Datei) kann ein einfaches Kommando auch mit einer Zuweisung an eine Shellvariable beginnen.

Für jedes einfache Kommando können die offenen Datenkanäle umgeleitet, sowie neue erzeugt werden.

Quotierung

     Quotierung wird benutzt, um die spezielle Bedeutung von Kontrollzeichen, reservierten Wörtern oder Namen auszuschalten. Auf diese Weise können Parameter an Funktionen übergeben werden, die Sonderzeichen, Namen oder reservierte Wörter enthalten, ohne daß die Shell eine Veränderung an den Parametern vornimmt.

Es gibt drei Formen der Quotierung:

1.
durch das Fluchtsymbol \  (Backslash) 
2.
durch Hochkomma ' (Quote)  
3.
durch Anführungszeichen " (Doublequote)  

Das Fluchtsymbol ,,entwertet`` das unmittelbar folgende Sonderzeichen. Ein durch das Fluchtsymbol entwertetes Zeilenende wird ignoriert.

Die in Hochkommata eingeschlossenen Wörter werden von der Shell nicht weiter bearbeitet. Lediglich ein Hochkomma darf nicht in Hochkommata eingeschlossen werden; auch nicht wenn, es durch ein Fluchtsymbol eingeleitet wird.

Von den in Anführungszeichen eingeschlossenen Wörtern erkennt die Shell nur die Sonderzeichen $, ' und \ als solche. Alle anderen Wörter bleiben unbearbeitet. Das Fluchtsymbol behält seine Bedeutung aber nur, wenn es von einem der Zeichen $ ' " \ oder dem Zeilenende (RETURN) gefolgt wird. Ein Anführungszeichen darf zwischen zwei Anführungszeichen stehen, wenn es durch ein Fluchtsymbol eingeleitet wird.

Die speziellen Parameter * und @ haben eine besondere Bedeutung, wenn sie zwischen Anführungszeichen auftauchen.

Von Anführungszeichen eingeschlossene Zeichenketten, denen ein Dollarzeichen vorangestellt ist, werden nach Möglichkeit dem aktuellen Locale entsprechend übersetzt. Wenn das aktuelle Locale C oder POSIX ist, wird das Dollarzeichen ignoriert. Die resultierende Zeichenkette bleibt in Anführungszeichen eingeschlossen.

Ein-/Ausgabe-Umleitung

   Jedes Programm erhält automatisch beim Start drei offene ,,Datenkanäle``: die Standardeingabe, die Standardausgabe und die Standardfehlerausgabe.

Bevor eine Kommandozeile ausgeführt wird, können die bestehenden Eingabe- und Ausgabekanäle umgelenkt, sowie neue erzeugt werden. Auf diese Weise können Dateien im Dateisystem zum Lesen bzw. Schreiben für das Kommando geöffnet werden, die nach dessen Beendigung automatisch wieder geschlossen werden. Beispielsweise kann so die Ausgabe des ls-Kommandos zur weiteren Bearbeitung in eine Datei geschrieben werden.

Wenn mehrere Kanalumlenkungen in einer Kommandozeile auftauchen, werden sie der Reihe nach von links nach rechts ausgewertet.

Wenn in einer der folgenden Beschreibungen die Kanalnummer einer Datei nicht angegeben wird, so wird bei einer Eingabeumleitung die Standardeingabe (Kanal 0) und bei einer Ausgabeumleitung die Standardausgabe (Kanal 1) umgeleitet.

Das auf den Umleitungsoperator folgende Wort wird allen möglichen Parametererweiterungen unterworfen. Wenn durch die Erweiterung mehr als ein Wort entsteht, wird eine Fehlermeldung ausgegeben.

Mit Hilfe des exec-Shellkommandos kann auch die Eingabe/Ausgabe der aktiven Shell umgelenkt werden, indem exec ohne Kommando, aber mit entsprechenden Umleitungen aufgerufen wird (siehe exec).

Wenn in einem Kommando mehrere Umleitungen gelegt werden, ist die Reihenfolge signifikant. Ein Beispiel hierfür ist bei der Verdoppelung der Dateikennung gegeben.

Eingabeumleitung

 

[n]<Wort

erzeugt entweder eine Eingabeumleitung von der mit dem (erweiterten) Wort bezeichneten Datei auf den Kanal mit der Nummer n, oder auf die Standardeingabe (Kanal 0), wenn keine Zahl n angegeben wird.

Ausgabeumleitung

 

[n]>Wort

lenkt den Ausgabekanal mit der Nummer n auf die mit dem Wort bezeichnete Datei um. Wenn keine Zahl für die Kanalnummer angegeben ist, wird die Standardausgabe (Kanal 1) angenommen.

Wenn die angegebene Datei nicht existiert, wird sie erzeugt. Wenn eine Datei dieses Namens existiert, wird sie überschrieben, solange die Shelloption noclobber nicht gesetzt ist.

Anfügen der Ausgabe an eine existierende Datei

[n]>>Wort

öffnet die Datei mit dem angegebenen Namen zum Anhängen von Daten. Die Daten aus dem Ausgabekanal mit der Nummer n werden an die Datei angehängt. Wenn die Kanalnummer fehlt, wird die Standardausgabe umgelenkt.

Wenn die Datei nicht existiert, wird sie erzeugt.

Zusammenfassung der Standardausgabe mit der Standardfehlerausgabe

 

&>Wort oder
>&Wort

legt die Kanäle für die Standardausgabe und die Standardfehlerausgabe zusammen und schreibt sie in eine Datei namens Wort. Von den beiden Formen sollte die erste bevorzugt werden.

Shellscript-Dokumente

    <<[-]Wort
Dokument
Begrenzer

Diese Art der Kanalumlenkung wird benutzt, um einen Teil des Shellscripts direkt als Standardeingabe für ein Kommando zu benutzen. Es werden alle Zeilen des Dokumentes gelesen und als Eingabe an das Kommando weitergeleitet, bis eine Zeile auftaucht, die nur den Begrenzer enthält. Das in der ersten Zeile festgelegte Wort wird keiner Erweiterung unterzogen. Wenn es aber irgendeine Art der Quotierung enthält, ist der Begrenzer das Wort ohne die Quotierung. In diesem Fall wird aber das Dokument ohne jede Erweiterung an das Kommando weitergegeben. Anderenfalls (wenn das Wort keine Quotierung enthält) werden alle Parameter im Dokumenttext erweitert und es wird die Kommandosubstitution durchgeführt.

In dem zweiten Fall wird ein durch das Fluchtsymbol `\' eingeleitetes Zeilenende ignoriert. Um das Fluchtsymbol selbst sowie die Zeichen $ und ' im Dokument darstellen zu können, müssen sie ebenfalls durch ein Fluchtsymbol eingeleitet werden.

Wenn das optionale Minuszeichen bei der Einleitung des Shellscript-Dokumentes auftaucht, werden alle Leerzeichen und Tabulatoren am Anfang der Dokumentzeilen ignoriert. Dadurch kann das Dokument durch Einrückung deutlich von dem übrigen Shellscript abgesetzt werden, ohne daß diese Einrückung auch in der Ausgabe erscheint.

Verdoppelung der Dateikennung

[n]<&Wort
kopiert die in Wort enthaltene (ganzzahlige) Eingabedateikennung. Es wird die neue Dateikennung n als Eingabekanal erzeugt oder eine existierende Kennung überschrieben.

Wenn im Wort anstelle einer Zahl ein `-' steht, wird der Kanal n geschlossen. Wenn das Wort leer ist, wird es durch die Standardeingabe ersetzt.

[n]>&Wort
verdoppelt die Ausgabedateikennung in Wort. Wenn das Wort leer ist, wird hier die Standardausgabe eingesetzt. Ansonsten ist die Funktion die gleiche wie bei der Verdoppelung der Eingabekennung.

Ein Beispiel soll die Funktion der Verdoppelung verdeutlichen:   Die Konstruktion

$ ls /usr/local/foo > inhalt 2>&1
$ cat inhalt
ls: /usr/local/foo: No such file or directory
$ _
lenkt die Standardausgabe und die Standardfehlerausgabe in die Datei inhalt um.

Die Konstruktion

$ ls /usr/local/foo 2>&1 > inhalt
ls: /usr/local/foo: No such file or directory
$ cat inhalt
$ _
lenkt dagegen nur die Standardausgabe in die Datei inhalt um.

Beim ersten Beispiel wird zuerst die Standardausgabe in die Datei umgelenkt, danach wird der Standardausgabekanal verdoppelt und dabei die Standardfehlerausgabe ersetzt. Im zweiten Beispiel wird zuerst die Standardfehlerausgabe durch die Standardausgabe ersetzt. Das ist in diesem Moment aber noch der Bildschirm. Erst danach wird die Standardausgabe mit der Datei verbunden. Die Kopie des Standardausgabekanals (die Standardfehlerausgabe) wird von dieser Umlenkung aber nicht betroffen!

Öffnen einer Datei zum Lesen und Schreiben

[n]<>Wort
öffnet die im Wort benannte Datei zum Lesen und Schreiben.

Pipelines

     

Die engste Verknüpfung mehrerer einfacher Kommandos wird durch eine sogenannte Pipeline hergestellt. Das Charakteristikum einer Pipeline ist die Zusammenlegung des Standardausgabekanals des einen Kommandos mit dem Standardeingabekanal des zweiten. Dabei wird die Multitasking-Fähigkeit von Linux ausgenutzt und die beiden (oder mehr) Kommandos als separate Prozesse gleichzeitig gestartet.

Die Syntax für die Zusammenfassung zweier Kommandos in einer Pipeline sieht folgendermaßen aus:

[time [-p]] [ ! ] Kommando |Kommando [ |Kommando] ...

Der entscheidende Kontrolloperator ist das Zeichen `|' (Pipe).

   

Seit der Version 2.0 benutzt die bash das zusätzliche Schlüsselwort time, das dazu dient, die Ausführungszeit der Pipeline zu ermitteln.

Der Status der gesamten Pipeline ist gleich dem Status des letzten Kommandos in der Pipeline (siehe status). Durch das Ausrufezeichen wird der Wahrheitswert des Status umgekehrt.

Die Verknüpfung der Standardkanäle findet vor einer eventuellen Umlenkung durch eines der Kommandos statt. Das bedeutet, daß die Zusammenlegung von Standardfehlerausgabe und Standardausgabe tatsächlich in der Pipeline mündet.

Die parallele Ausführung aller einfachen Kommandos einer Pipeline legt es nahe, die komplette Pipeline syntaktisch als Einheit zu betrachten. Wenn im folgenden nicht ausdrücklich von einfachen Kommandos die Rede ist, steht ,,Kommando`` auch für Pipelines.

Es können mehrere Kommandos durch Pipelines verkettet werden. Dabei sind aber nur zwei Pipelines für jedes einfache Kommando erlaubt - jeweils eine für die Standardeingabe und die Standardausgabe. Soll ein Kommando aus mehreren Pipelines gleichzeitig lesen, kann das ab bash-1.13 durch die Prozeßsubstitution mit Named-Pipes realisiert werden.

Hintergrundprozesse

      

Nachdem die Kommandozeile von der Shell bearbeitet ist, werden die darin enthaltenen Kommandos ausgeführt. Ein Kommando oder eine Pipeline wird dann zu einem Job. Dieser Job läuft weitgehend unabhängig von der Shell; trotzdem steht die Shell weiterhin mit allen Jobs in Verbindung und kann über Signale mit ihnen kommunizieren. Zu diesem Zweck unterhält die bash eine Tabelle aller aktuellen Jobs.

Wenn ein Job mit dem `&'-Zeichen im Hintergrund gestartet wird, gibt die bash eine Zeile mit der Jobnummer und der Prozeßnummer für diesen Job aus. Wenn ein Hintergrundjob beendet ist, wird wieder eine Meldung mit dem Namen, der Jobnummer und dem Status des Jobs ausgegeben.

Mit der Tastenkombination ^Z ist es jederzeit möglich, einen im      Vordergrund laufenden Job anzuhalten. Es erscheint dann eine Meldung mit der Jobnummer und dem Namen des angehaltenen Jobs. Danach erscheint die Eingabeaufforderung der Shell.

Ein angehaltener Job kann mit dem bg- oder dem fg- Shellkommando im Hintergrund oder im Vordergrund gestartet werden. Mit dem kill-Kommando wird er abgebrochen (siehe bg, fg und kill).

Im Zusammenhang mit den genannten Kommandos kann ein Job mit seiner Jobspezifikation und seiner Prozeßnummer angesprochen werden.

Als Jobspezifikation werden die Jobnummer oder der Anfang des Jobnamens erkannt,  indem sie durch ein Prozentzeichen `%' eingeleitet werden. Die Jobnummer ist die laufende Nummer, unter der der Job in der Jobtabelle geführt wird. Der zuletzt angehaltene Job wird auch als aktueller Job bezeichnet und kann mit `%+' angesprochen werden. Der zuvorletzt angehaltene Job wird auch als der letzte Job bezeichnet und kann mit `%-' benannt werden. Wenn ein angegebener Anfang auf mehrere Jobs paßt, wird eine Fehlermeldung ausgegeben. Ein Job kann auch einfach durch Angabe seiner Jobspezifikation (ohne Kommando) aus dem Hintergrund in den Vordergrund geholt werden. Zum Beispiel bringt `fg %1' den angehaltenen oder im Hintergrund laufenden Prozeß mit der Jobnummer 1 im Vordergrund zum Laufen.

Bei der Ausgabe der Jobtabelleneinträge wird der aktuelle Job mit einem `+' gekennzeichnet und der letzte Job mit einem `-'.

Wenn die Shell beendet werden soll, während sich angehaltene Jobs im Hintergrund befinden, wird eine Warnung ausgegeben und die Shell nicht beendet. Erst wenn die Shell entweder unmittelbar darauf, oder nach einem einzigen jobs-Shellkommando ein zweites Mal beendet wird, werden alle verbleibenden Jobs automatisch terminiert.

Wenn zum Zeitpunkt des Ausloggens noch Jobs im Hintergrund laufen, werden diese Jobs beim Verlassen der Shell automatisch an den init-Prozeß übereignet und laufen so weiter.

 

Listen

 

Neben der Möglichkeit, zwei oder mehr einfache Kommandos in einer Pipeline parallel aufzurufen, erlaubt die Shell weitere Aufrufe mehrerer Kommandos in einer einzigen Zeile. Diese Aufrufe werden als Listen bezeichnet.

Eine Folge von Kommandos kann durch die Kontrolloperatoren &&, ||, & oder ; zu einer Liste zusammengefaßt werden. Die Liste wird durch ein &, ; oder ein Zeilenende (RETURN) abgeschlossen.

Listen mit ; und &

 

Ein Semikolon kann zum Abschluß eines Kommandos benutzt werden. Auf diese Weise können beliebige Kommandos zu einer Liste zusammengefügt werden, indem sie, durch Semikolon getrennt, auf einer Zeile eingegeben werden. Die Ausführung der beiden Kommandos geschieht unabhängig, nacheinander.

Mit dem &-Operator wird ebenfalls ein Kommando abgeschlossen. Auch mit diesem Operator können also zwei Kommandos auf einer Zeile getrennt werden. Jedes mit einem & abgeschlossene Kommando wird unabhängig von den anderen Kommandos der gleichen Zeile im Hintergrund ausgeführt. Es können auf diese Weise also zwei oder mehr Kommandos parallel aufgerufen werden. Diese Kommandos stehen während der Ausführung nicht in Verbindung zueinander. Wenn alle Kommandos einer Zeile durch ein & abgeschlossen werden, erscheint bei der interaktiven Shell sofort die nächste Eingabeaufforderung.

Bedingte Ausführung

Die Kontrolloperatoren && und || verknüpfen zwei Kommandos logisch miteinander. Das zweite Kommando dieser Liste wird in Abhängigkeit vom Ergebnis (Status) des ersten ausgeführt.

Bei der Verknüpfung durch

Kommando1 [ && Kommando2 ...]

wird das Kommando2 nur dann ausgeführt, wenn Kommando1 fehlerfrei abgeschlossen wurde. Man kann das als eine logische UND-Verknüpfung der beiden Kommandos betrachten. Der Status der UND-Liste ist wahr (Null), wenn beide Kommandos ,,wahr`` sind. Wenn bereits das erste Kommando Null liefert, wird das zweite zur Bewertung des Gesamtausdrucks nicht mehr benötigt, also wird es auch nicht ausgeführt.

Das Pendant zur UND-Liste ist die ODER-Verknüpfung durch

Kommando1 [ ||Kommando2 ...]

Hier wird das Kommando2 nur dann ausgeführt, wenn bei der Bearbeitung vom Kommando1 ein Fehler aufgetreten ist. Analog zur UND-Verknüpfung kann auch die Verkettung durch || als logische ODER-Verknüpfung betrachtet werden. Der Status der ODER-Liste ist wahr, wenn das erste oder das zweite Kommando einen Status Null liefert. Wenn das bereits beim ersten Kommando erfüllt ist, wird das zweite nicht mehr ausgeführt.[*]

 

Gruppen und Kontrollstrukturen: Blöcke, Schleifen, Verzweigungen, Funktionen

 

Einzelne Kommandos oder Listen können auf verschiedene Weisen weiter zu Gruppen zusammengefaßt werden:

{Liste;}
Mit den geschweiften Klammern werden die Kommandos der Liste zu einer einfachen Gruppe zusammengefaßt. Diese Klammerung entspricht der in mathematischen Ausdrücken und dient der Assoziierung nieder- oder gleichrangig verknüpfter Kommandos.

Die Operatoren zur Shellprogrammierung unterscheiden sich in Rang und Assoziativität. Prinzipiell wird eine Kommandozeile von links nach rechts abgearbeitet. Die Zusammenfassung in UND- oder ODER-Listen hat gegenüber der Auflistung mit Semikolon oder & Vorrang. Die Zusammenfassung einfacher Kommandos in Pipelines hat wiederum größere Assoziativität als die Listen. Die beiden Zeilen

{ cat /etc/gettydefs || cat /etc/gettytab; }| grep 38400
cat /etc/gettydefs || cat /etc/gettytab | grep 38400
unterscheiden sich syntaktisch nur in der Klammerung, die größere Assoziativität der Pipeline führt in der zweiten Zeile aber zu einer impliziten Klammerung der beiden letzten Kommandos. Die erste Zeile schreibt die erste existierende der beiden angegebenen Dateien in den Standardausgabekanal, der durch eine Pipeline dem grep-Kommando zur Auswertung übergeben wird. Die zweite Zeile schreibt entweder die Datei /etc/gettydefs auf den Bildschirm (Standardausgabe), oder sie übergibt die Datei /etc/gettytab dem grep-Kommando.

Die geschweiften Klammern trennen selbst keine Kommandos (siehe oben). Aus diesem Grund ist ein Leerzeichen zwischen der einleitenden Klammer und dem ersten Kommando der eingeschlossenen Liste notwendig. Um die Trennung zum ersten Kommando nach der abschließenden Klammer eindeutig anzugeben, ist es sinnvoll, die eingeklammerte Liste immer mit einem Semikolon abzuschließen. Im Gegensatz zur Bourne-Shell wird in dem Beispiel oben das Kommando korrekt interpretiert, wenn das Semikolon weggelassen wird, weil die der Klammer folgende Pipeline die Kommandos trennt.

Im Unterschied zur Bourne-Shell wird bei der bash auch in dem Beispiel oder bei einer Ausgabeumlenkung für die komplette Klammer keine Subshell erzeugt.

(Liste)
Durch runde Klammerung werden die Kommandos einer Liste in einer eigenen (Shell-) Umgebung ausgeführt. Wenn von den Kommandos der Liste Veränderungen an der Shellumgebung vorgenommen werden, sind diese außerhalb der eingeklammerten Gruppe nicht sichtbar. Wenn zum Beispiel innerhalb einer so geklammerten Gruppe das Verzeichnis gewechselt wird, beziehen sich alle weiteren Kommandos innerhalb der Gruppe auf dieses Verzeichnis; außerhalb der Klammerung bleibt das ,,alte`` Verzeichnis aktuell. Beispiel:

cd /
$ (cd /usr/bin; ls e*); ls -F
egrep    elvis    elvprsv  elvrec   env      ex       expand
bin/         etc/         lost+found/  root/        usr/
boot/        home/        mnt/         sbin/        var/
dev/         lib/         proc/        tmp/         vmlinuz
$ _
erzeugt eine Subshell, in der aus dem aktuellen Wurzelverzeichnis in das Verzeichnis /usr/bin gewechselt wird. Hier können beispielsweise alle Dateien angezeigt werden, deren Name mit einem `e' beginnt. Mit den schließenden Klammern wird auch die Subshell beendet. Das darauffolgende Listing findet wieder im ursprünglich aktuellen Verzeichnis statt.

for Name [in Wort] do Liste done
  Mit dieser Konstruktion stellt die bash die von vielen Programmiersprachen bekannte und bewährte for-Schleife bereit. Mit Name wird eine Shellvariable definiert, die in jedem Schleifendurchlauf einen neuen Wert erhält. Die Anzahl der Schleifendurchläufe entspricht der Anzahl der vorhandenen Werte.

Die Werte werden normalerweise nach dem Schlüsselwort in übergeben. Dazu können mehrere Wörter angegeben werden, die von der Shell erweitert werden. Für jeden Durchlauf wird ein Token in der Variablen Name übergeben.

Wenn der `in Wort' Teil fehlt, wird die Liste für jeden gesetzten Positionsparameter einmal ausgeführt.

Die interaktive Eingabe einer for-Schleife wird (wie die Eingabe jedes anderen aus mehreren Teilen bestehenden Konstrukts) von der Shell unterstützt, indem sie einen sekundären Prompt (PS2) zur Eingabe einer Schleife über mehrere Zeilen anbietet. Dieser sekundäre Prompt wird ausgegeben, solange die Schleife nicht mit done abgeschlossen ist.

Als Status wird der Rückgabewert des letzten ausgeführten Kommandos zurückgegeben. Wenn kein Kommando ausgeführt wurde, ist der Status Null.

In dem folgenden Beispiel werden im aktuellen Verzeichnis alle Dateien mit der Endung `foo' umbenannt, so daß sie auf `bar' enden. 

$ for i in *.foo; do
> base=`basename $i .foo`
> mv $i $base.bar
> done
$ _
Die Zuweisung der Ausgabe vom Shellutility basename an die Variable base findet durch ,,Kommandosubstitution`` statt. Diese Operation wird durch die ,,Backquotes`` ausgelöst, nicht durch Hochkomma.

Die bash bietet mit ihrer Parametererweiterung eine andere schöne Methode, die Endung vom Dateinamen zu trennen: mit der Konstruktion base=${i%.foo} (Parametererweiterung). Das spart den Aufruf eines externen Kommandos und verbessert damit die Performance.

Wenn eine Variable innerhalb einer for-Schleife verändert wird, ist der neue Wert auch außerhalb der Schleife sichtbar. Die bash verhält sich damit POSIX-1003.2-konform. Eine Ausnahme kann für die Zählvariable erreicht werden, indem das Kommando set -l gegeben wird. In diesem Fall wird die Zählvariable nach dem letzten Durchlauf auf den Wert vor Beginn der Schleife zurückgesetzt.

while Liste do Liste done
  Von anderen Programmiersprachen ebenso bekannt ist die while ... do ... done-Schleife. Hier wird der Schleifenkörper `do Liste done' so lange wiederholt, bis die in `while Liste' formulierte Bedingung falsch ist. Das ist der Fall, wenn das letzte Kommando der while Liste einen Status ungleich Null liefert.

Bei der interaktiven Eingabe einer while-Schleife wird so lange der sekundäre Prompt (PS2) ausgegeben, bis die Schleife mit done abgeschlossen ist.

Der Status der while-Schleife ist gleich dem Status des letzten Kommandos des `do-Teils' oder Null, wenn kein Kommando ausgeführt wurde.

Im folgenden Beispiel wird die while-Schleife benutzt, um die Unterverzeichnisse z. B. des Verzeichnisses /usr/local/man anzulegen.

$ declare -i zahl=1
$ while [ $zahl -lt 10 ]
> do
> mkdir man$zahl
> mkdir cat$zahl
> zahl=$((zahl+1))
> done
$ _
Die Deklaration von zahl als Integer-Variable ist an dieser Stelle nicht notwendig, weil die Zuweisung einer Zahl und die Verwendung in arithmetischen Ausdrücken diese Interpretation implizieren.

Zur Inkrementierung der Zählvariablen wird die Arithmetische Erweiterung benutzt, die hier beschrieben ist. Die bash erlaubt ab Version 1.13 auch die direkte Inkrementierung einer Integer-Variablen durch den `+=' Zuweisungsoperator in einer arithmetischen Erweiterung oder mit dem let-Shellkommando. Beide Varianten sind in der Standard-Bourne-Shell nicht vorgesehen.

until Liste do Liste done
  Die until-Schleife entspricht der while-Schleife mit dem Unterschied, daß der do-Teil so lange ausgeführt wird, wie das letzte Kommando der `until Liste' einen Status ungleich Null liefert.

if Liste then Liste [elif  Liste then Liste ...] [else Liste] fi
Mit der if-Konstruktion werden die Kommandos der then Liste unter der Bedingung ausgeführt, daß das letzte Kommando der if Liste ,,wahr`` ist, also einen Status Null liefert.

Mit der optionalen elif-Konstruktion können beliebig lange if-else-Ketten erzeugt werden. Wenn der `elif Liste'-Teil des letzten elif nicht Null liefert, wird der abschließende else-Teil bearbeitet.

Wie bei den Schleifen wird auch bei der interaktiven Eingabe einer if-Anweisung der sekundäre Prompt ausgegeben, bis die Konstruktion mit einem fi abgeschlossen ist.

Der Status der gesamten if-Konstruktion ist gleich dem Status des zuletzt ausgeführten Kommandos, oder Null, wenn kein Kommando ausgeführt wurde.

Das folgende Beispiel zeigt, wie in der Initialisierungsdatei ~/.bashrc zwischen einer Shell im xterm und den Textbildschirmen unterschieden werden kann.

if [ $WINDOWID ]; then
   TERM=xterm
   export XDVIFONTS=/usr/TeX/lib/tex/fonts/%f.%d%p
   export OPENWINHOME=/usr/openwin
   export PAGER=/usr/X386/bin/xless
else
   export PAGER=/usr/bin/less
fi
Ein weiteres Beispiel zeigt, wie in einem Shellscript  unterschieden werden kann, ob die aufrufende Shell interaktiv arbeitet oder nicht.
if [ "${-#*i}" = "$-" ]; then
   echo Die Shell arbeitet nicht interaktiv
else
   echo Die Shell arbeitet interaktiv
fi
Der in diesem Beispiel benutzte Ausdruck ["${-#*i}" = "$-" ] ist ein schönes Beispiel für die Parametererweiterung, wie sie hier erklärt ist. Im Spezialparameter - sind die Optionsflags der Shell gespeichert. Durch die ,,Erweiterung`` ${-#*i} wird aus dieser Zeichenkette ein `i' (und alle Zeichen davor) entfernt, wenn es enthalten ist. Der umschließende test vergleicht die so eventuell verkürzte Zeichenkette mit dem Original. Wenn sie gleich sind, ist die `i'-Option der interaktiven Shell nicht gesetzt.

Die Anführungszeichen sind in dem Beispiel notwendig, weil die Shellvariable `-' auch leer sein kann. In diesem Fall würde sie ohne die Anführungszeichen aus der Kommandozeile entfernt, was in dem Vergleich zu einem verdeckten Syntaxfehler und einem falschen Ergebnis des Tests führen könnte.

case Wort in [Muster  [ |Muster ...] ) Liste ;; ...] esac
Mit der case-Anweisung können leicht Verzweigungen programmiert werden, bei denen viele Fälle unterschieden werden.

Das case Wort wird von der bash erweitert, dann wird die daraus entstandene Zeichenkette mit den Mustern verglichen und bei Übereinstimmung die Liste von Kommandos ausgeführt. In den Suchmustern können reguläre Ausdrücke wie bei der Pfadnamenerweiterung (z. B. `*' und `?') verwendet werden.

Wenn ein übereinstimmendes Muster gefunden wurde, wird die case-Anweisung beendet und nicht nach weiteren Übereinstimmungen gesucht.

Der Status ist Null, wenn keine Übereinstimmung gefunden wurde. Sonst wird der Status des zuletzt ausgeführten Kommandos der Liste übergeben.

Das dem letzten Beispiel zugrunde liegende Problem kann auch mit der case-Anweisung gelöst werden. Diese Lösung ist zwar kein typisches Beispiel für eine Vielfachverzweigung, sie bietet sich aber wegen der Auswertung regulärer Ausdrücke durch case in der Praxis eher an als das oben gegebene Beispiel.

case $- in
        *i\*) echo hier sollte nach der Zeichenkette 'i*'
              echo gesucht werden.
              echo   *****FEHLER***** in der bash-1.12.;;
        *i*)  echo Die Shell arbeitet interaktiv.;;
        *)    echo Die Shell arbeitet nicht interaktiv.;;
esac
In der bash Version 1.12 konnte mit der case-Anweisung nicht nach regulären Ausdrücken selbst gesucht werden, die Quotierung der Wildcards wurde ignoriert. Ab Version 1.13 ist dieser Fehler behoben.

select Name [in Wort...;] do Liste done
Die select- Kontrollstruktur bietet eine Kombination aus menügesteuerter Verzweigung und Schleife.       

Der in Wort-Teil wird erweitert und die so generierten Wörter als numerierte Liste (Menü) auf dem Standardfehlerkanal ausgegeben. Mit dem PS3-Prompt wird daraufhin eine Eingabe von der Tastatur gelesen. Eine leere Eingabe führt zu einer erneuten Anzeige des Menüs.

Wenn ein Wort aus der Liste durch seine Nummer bestimmt wird, führt die bash die Kommandos der do Liste aus und stellt dabei das ausgewählte Wort in der Variablen Name zur Verfügung. Wird in der Eingabezeile keine passende Zahl übergeben, ist Name leer, die Eingabezeile ist aber in der Variablen REPLY gespeichert.

Menüteil und Ausführung der Liste werden so lange wiederholt, bis die Schleife mit break oder return verlassen wird. Es ist möglich, mit CONTROL-D das Menü unmittelbar zu verlassen.

Wenn der in Wort-Teil fehlt, werden stattdessen die Positionsparameter verwendet.

[function] Name () {Liste}
    definiert eine neue Scriptfunktion Name. 

Scriptfunktionen sind Teile eines Shellscripts oder einer Initialisierungsdatei für eine interaktive Shell, die komplett in der Shellumgebung gespeichert werden. Wenn ein Kommando in der Kommandozeile mit einer solchen Funktion übereinstimmt, wird die unter dem Funktionsnamen gespeicherte Liste von Kommandos ausgeführt. Es wird dazu kein neuer Prozeß erzeugt.

Im Unterschied zu alias-Synonymen können Scriptfunktionen Argumente verarbeiten. Wenn die Scriptfunktion mit Argumenten aufgerufen wird, werden diese Argumente der Funktion als Positionsparameter übergeben. Der Spezialparameter `#' wird aktualisiert. Der Positionsparameter `0' bleibt allerdings unverändert. 

Mit dem local-Shellkommando ist es möglich, lokale Variablen für Scriptfunktionen zu erzeugen. Normale Shellvariablen sind ,,global``, sind also in der gesamten Shell uneingeschränkt sichtbar.

Wenn in einer Scriptfunktion das Shellkommando return auftaucht, wird die Funktion beendet und mit der dem Aufruf folgenden Zeile des Shellscripts oder der interaktiven Eingabe fortgesetzt. Die Positionsparameter und der Spezialparameter `#' werden auf ihre Werte vor dem Funktionsaufruf zurückgesetzt.

Eine Liste der definierten Scriptfunktionen erhält man in einer interaktiven Shell mit der Option `-f' zu den Shellkommandos declare oder typeset. Die Scriptfunktionen werden nur dann an alle Untershells weitergereicht (und stehen nur dann auch in diesen Shells zur Verfügung), wenn sie mit der Shellfunktion export unter der Option `-f' für den Export bestimmt wurden.

Scriptfunktionen können rekursiv aufgerufen werden. Es gibt keine Begrenzung für die Anzahl der rekursiven Aufrufe.

 

Parameter

  

Aus dem Blickwinkel des Shellprogrammierers ist die zentrale Rolle von Variablen unmittelbar klar. Variable sind symbolische Namen für Platzhalter, in denen Werte (Zahlen oder Zeichenketten) gespeichert werden können.

Eine Variable kann durch eine Zuweisung der folgenden Form erzeugt werden:

Name=[Wert]

Als Namen für Variable kommen beliebige alphanumerische (ASCII-) Zeichenketten in Frage, die mit einem Buchstaben beginnen. Der Unterstrich `_' wird zu den erlaubten Buchstaben gerechnet.

Zwischen den Bestandteilen der Zuweisung dürfen keine Leerzeichen stehen.

Wenn kein Wert angegeben ist, wird der Variablen die leere Zeichenkette (Nullstring) zugewiesen.

Es ist nicht notwendig (aber möglich), Variable zu deklarieren. Automatisch erzeugte Variable speichern alle ihnen zugewiesenen Werte als Zeichenketten. Die Interpretation des Inhalts einer Variablen erfolgt ,,aus dem Zusammenhang``. Das heißt, in arithmetischen Ausdrücken werden Ziffernfolgen automatisch als Zahlen interpretiert. Durch ausdrückliche Deklaration einer Variablen als Integer (mit der Shellfunktion declare -i) wird erreicht, daß jede Zuweisung automatisch der arithmetischen Erweiterung unterworfen wird. Damit ist garantiert, daß eine solche Variable nach ihrer Initialisierung immer Zahlen enthält.

Der Zugriff auf den Wert eines Parameters bzw. die Übergabe eines Parameters erfolgt durch den Operator `$' gefolgt von der Parameterbezeichnung.

Ein Parameter gilt als gesetzt, wenn ihm ein Wert zugewiesen wurde. Eine leere Zuweisung - der Nullstring ' ' - gilt als Wert in diesem Sinne. Wenn eine Variable gesetzt ist, kann sie nur durch das unset-Kommando entfernt werden.

Shell- und Umgebungsvariable

    Shellvariable haben auch in der interaktiven Shell eine große Bedeutung.

Auf der Benutzerebene können Umgebungsvariable wie Shellvariable beliebig erzeugt, gelesen und verändert werden. Deshalb erscheinen die Umgebungsvariablen als eine Untermenge der Shellvariablen. Umgebungsvariable können mit dem printenv-Kommando oder dem export-Shellkommando angezeigt werden. Sämtliche definierten Shellvariablen werden mit dem set-Shellkommando ausgegeben.

Die folgenden Variablen werden von der Shell ausgewertet. In einigen Fällen wird die Variable mit einem Standardwert initialisiert.

BASH_ENV
entspricht in der Funktion der Shellvariablen ENV. Im gegensatz zu letzterer wird BASH_ENV jedoch nur verwendet, wenn die Shell zur Bearbeitung eines Shellscripts unter den Namen bash aufgerufen wird. 
CDPATH
ist eine durch Doppelpunkt getrennte Liste von Verzeichnissen. Wenn beim cd-Shellkommando kein absoluter Verzeichnisname und kein Verzeichnis relativ zum aktuellen Verzeichnis benannt wird, werden alle Verzeichnisse im CDPATH nach einem passenden Verzeichnis durchsucht. In das erste passende Verzeichnis wird gewechselt. 

ENV
enthält den Namen einer Datei, die Kommandos zur Initialisierung für die Shellumgebung beim Bearbeiten von Shellscripts enthält. (z.B. die Datei ~/.bashrc) 
FCEDIT
benennt einen anderen Editor als vi als Standardeditor für das fc-Shellkommando.
FIGNORE
kann eine durch Doppelpunkte getrennte Liste von Dateiendungen enthalten, die bei der automatischen Dateinamenerweiterung ignoriert werden sollen. Beispielsweise kann diese Variable mit ,,.o:.bak:.old:~`` belegt werden.
GLOGBIGNORE
kann eine durch Doppelpunkte getrennte Liste von Namen und Mustern enthalten, die bei der Pfadnamenerweiterung ignoriert werden sollen.  
histchars
enthält zwei oder drei Zeichen zur Kontrolle der Wiederholung von Kommandos aus dem Kommandozeilenspeicher. Das erste Zeichen leitet eine Kommandozeilenerweiterung aus dem Kommandozeilenspeicher ein. Die Voreinstellung ist `!'. Das zweite Zeichen leitet die ``Schnellsubstituion'' ein und ist mit ^ vorbelegt. Das optionale dritte Zeichen kennzeichnet einen Kommentar im Historykommando. Wenn es als erstes Zeichen eines Wortes auftaucht wird der Rest der Zeile bei der History-Erweiterung ignoriert. Das bedeutet nicht unbedingt, daß die Shell bei der weiteren Interpretation den Zeilenrest als Kommentar erkennt.
HISTCONTROL oder history_control
bestimmt, welche Kommandos in den Kommandozeilenspeicher geschrieben werden. Wenn die Variable das Wort `ignorespace' enthält, werden nur die Zeilen in den Speicher geschrieben, die nicht mit einem Leerzeichen beginnen. Wenn die Variable das Wort `ignoredups' enthält, werden alle Zeilen, die der zuletzt gespeicherten Zeile entsprechen, nicht gespeichert. `ignoreboth' ist die Kombination der beiden anderen Schalter. Wenn die Variable nicht gesetzt ist oder irgendeinen anderen Wert enthält, werden alle Kommandozeilen in den Kommandozeilenspeicher geschrieben.
HISTFILE
benennt eine Datei, in die der Inhalt des Kommandozeilenspeichers beim Beenden der Shell automatisch gesichert wird. Der Kommandozeilenspeicher wird beim Start einer neuen Shell aus dieser Datei aufgefüllt. Voreinstellung für HISTFILE ist ~/.bash_history Wenn Sie (z.B. im X Window System) mehrere Shells gleichzeitig mit derselben Sicherungsdatei benutzen, bleiben nur die Kommandozeilen der zuletzt beendeten Shell erhalten.
HISTFILESIZE
bestimmt die Anzahl der im HISTFILE zwischen zwei Sitzungen gespeicherten Kommandozeilen. Alle älteren Zeilen gehen verloren.
HISTIGNORE
kann eine durch Doppelpunkt getrennte Liste von Mustern enthalten, die auf Kommandozeilen angewendet werden, nachdem diese die Prüfung von HISTCONTROL bestanden haben. Es werden nur solche Kommandozeilen in die History übernommen, auf die das Muster nicht zutrifft. Zusätzlich zu den bei der Pfadnamenerweiterung üblichen Jokerzeichen bedeutet bei HISTIGNORE das Zeichen & die vorangehende Zeile in der History.
HISTSIZE
setzt die Anzahl der im Kommandozeilenspeicher erinnerten Zeilen fest. Alle älteren Zeilen werden vergessen.
HOME
ist das Heimatverzeichnis des aktuellen Benutzers. Dieses Verzeichnis wird in der Datei /etc/passwd bestimmt und von login automatisch in die Variable HOME geschrieben. Das in HOME gespeicherte Verzeichnis ist der Standardwert für das cd-Shellkommando.   
HOSTFILE oder hostname_completion_file
ist der Name einer Datei mit dem gleichen Format wie die Datei /etc/hosts. Die Einträge dieser Datei werden zur Hostnamenerweiterung verwendet.
IFS
ist der ,,interne Feldseparator``. Alle Zeichen dieser Shellvariablen werden als Trenner von Wörtern erkannt. Die Standardbelegung für IFS ist Leerzeichen, Tabulator und Zeilenende. 
IGNOREEOF
hat nur eine Bedeutung, wenn die Shell interaktiv läuft. Wenn die Variable eine ganze Zahl enthält, so wird diese Anzahl von `EOF'-Zeichen   (CTRL-D) für das Dateiende bzw. das Ende der Eingabe abgewartet, bevor die Shell verlassen wird. Zu jedem `EOF' wird der Hinweis ausgegeben, daß die Shell mit logout verlassen werden soll.

Wenn die Variable leer ist oder keine Zahl enthält, so ist die Voreinstellung 10. Wenn die Variable nicht gesetzt ist, führt jedes EOF-Zeichen sofort zum Verlassen der Shell.

INPUTRC
enthält den Namen der Initialisierungsdatei für readline.
LANG
dient zur ``weichen'' Voreinstellung für alle Locale-Kategorien. Jede Einzelkategorie kann wirksam mit einem anderen Wert belegt werden.
LC_ALL
dient zur verbindlichen Einstellung aller Locale-Kategorien. Abweichende Einstellungen einzelner Kategorien werden von dem hier festgelegten Wert verdrängt.
LC_COLLATE
Diese Variable wird von der bash ausgewertet, um die Sortierfolge der Dateinamen bei der Pfadnamen-Expansion festzuleten.
LC_MESSAGES
Diese Variable wird von der bash ausgewertet, um das Locale für die Übersetzung der $ Zeichenketten zu bestimmen.
MAIL
enthält den Namen der Datei, in der die elektronische Post für den Benutzer gespeichert wird. Wenn diese Datei nicht leer ist, wird der Anwender darauf hingewiesen, daß Post für ihn da ist.
MAILCHECK
spezifiziert die Zeitintervalle, nach denen die Shell prüft, ob Post da ist. Die Voreinstellung ist 60 Sekunden.
MAILPATH
ist eine durch Doppelpunkt getrennte Liste von (absoluten) Dateinamen, in denen Post für den Benutzer ankommen kann. Zu jeder Datei kann eine durch `?' eingeleitete Zeichenkette angegeben werden, die auf dem Bildschirm ausgegeben wird, wenn in der entsprechenden Datei Post angekommen ist.
MAIL_WARNING
ist ein Schalter. Ist die Variable gesetzt (egal, welcher Wert), erfolgt eine Warnung, wenn auf die Postdatei zugegriffen wurde. Damit kann sowohl festgestellt werden, ob neue Mail angekommen ist, als auch jeder (möglicherweise illegale) Lesezugriff auf die Mailbox überwacht werden.

Dieser Schalter funktioniert nur, wenn die Mailbox in einem Verzeichnis liegt, dessen Dateisystem die Zugriffszeit verwaltet (nicht Minix oder Extended1). In der Version 2.0 wird dieser Schalter nicht unterstützt.

OPTERR
ist ein Schalter. Wenn die Variable den Wert 1 enthält, werden die Fehlermeldungen der getopts-Shellfunktion ausgegeben. Enthält sie eine 0, werden die Fehlermeldungen unterdrückt.
PATH
enthält eine durch Doppelpunkt getrennte Liste von Verzeichnissen. Wenn ein einfaches Kommando nicht als internes Shellkommando erkannt wird und nicht mit komplettem Pfadnamen (das ist der Pfad vom aktuellen Verzeichnis oder vom Wurzelverzeichnis aus) angegeben wird, dann sucht die Shell in allen Verzeichnissen der PATH-Variablen nach einem Programm mit passendem Namen und führt es aus.

Ein einzelner Punkt anstelle des Wurzelverzeichnisses steht für das aktuelle Verzeichnis. Eine Tilde `~' steht für das Heimatverzeichnis des Anwenders.   

Der Standardpfad zu den ausführbaren Dateien eines Linux-Systems ist:

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin

Die Verzeichnisse sbin können für User ohne Systemverwaltungsaufgaben auch entfallen. Bei Installationen ohne X Window System kann das Verzeichnis /usr/X11R6/bin ebenfalls weggelassen werden. Durch die Installation zusätzlicher Software können Erweiterungen des Pfades um Verzeichnisse wie /usr/opt/bin oder /home/postgres/bin notwendig werden.

Die PATH-Variable wird in der Regel von der Systemverwalterin in der Datei /etc/profile für alle Login-Shells gemeinsam auf einen bestimmten Wert gesetzt. Dieser Wert kann vom Benutzer beliebig verändert werden. Die PATH- Variable kann nicht mit dem unset-Shellkommando gelöscht werden.

Aus Gründen der Systemsicherheit ist es sinnvoll, das aktuelle Verzeichnis (bezeichnet durch einen Punkt) nur als letztes der zu durchsuchenden Verzeichnisse anzugeben. Anderenfalls könnte ein Standardprogramm aus dem Systempfad versehentlich mit einem gleichnamigen Kommando im aktuellen Verzeichnis verwechselt werden.

PROMPT_COMMAND
benennt ein Kommando, das vor jeder Eingabeaufforderung automatisch ausgeführt wird.
PS1
ist die (rohe) Zeichenkette, die als Eingabeaufforderung   (Prompt) die Arbeitsbereitschaft der Shell anzeigt. Die Variable kann eine   Reihe symbolischer Namen enthalten, die vor der Ausgabe nach den im Abschnitt ``Eingabeaufforderung'' erläuterten Regeln erweitert werden. Die Voreinstellung ist `\$'.
PS2
enthält die Zeichenkette für die sekundäre Eingabeaufforderung. Sie wird genau wie PS1 erweitert. Die sekundäre Eingabeaufforderung erscheint, wenn zu einem gegebenen Kommando interaktiv über die Shell weitere Kommandos oder Parameter von der Tastatur gelesen werden sollen. (Zum Beispiel in einer for-Schleife) Die Voreinstellung ist `> '.
PS3
enthält den Prompt, mit dem die Eingabe bei der select-Konstruktion angefordert wird (siehe select). Voreinstellung ist `#?'.
PS4
wird zur Anzeige der erweiterten Kommandos mit der Option `-x' benutzt (siehe set). Voreinstellung ist `+'.
TIMEFORMAT
In dieser Shellvariablen kann ein Formatstring abgelegt werden, der die Ausgabe der shellinternen Funktion time bestimmt. Ähnlich wie bei printf leitet das Prozentzeichen % die Platzhalter für Zeitinformation im String ein.
%[p][l]R
(real time) die tatsächlich während der Ausführung des Kommandos vergangene Zeit
%[p][l]U
(user time) die für die Ausführung des Kommandos im User-Modus verbrauchte Zeit
%[p][l]S
(system time) die für die Ausführung des Kommandos im Kernel-Modus verbrauchte Zeit
%P
die Auslastung der CPU durch das Kommando in Prozent
Das optionale Argument p gibt die Anzahl der Dezimalstellen an, mit denen die Sekundenangaben formatiert werden. Die maximale Genauigkeit und gleichzeitig die Voreinstellung beträgt drei Dezimalstellen.

Der optionale Buchstabe l in der Formatangabe veranlaßt die Ausgabe eines längeren Formates, in dem auch die Minuten enthalten sind.

Zeilenvorschübe im Formatstring können durch die Tastenfolge ^-V ^-J erzeugt werden.

TMOUT
Mit dieser Variablen kann die Shell veranlaßt werden, nach einer bestimmten Zeit ohne Benutzeraktivität, also ohne Eingabe, automatisch zu beenden. Nur wenn die Variable eine Zahl enthält, wird diese Anzahl Sekunden auf die Eingabe gewartet.

Die folgenden Variablen werden automatisch durch die Shell gesetzt. Die meisten können vom Benutzer nicht verändert direkt werden.  

BASH
beinhaltet den kompletten Pfadnamen der aktuellen Shell.
BASH_VERSINFO
ist eine Array-Variable mit den einzelnen Komponenten der bereits in BASH_VERSION zusammengefaßten Versionsnummer.
BASH_VERSION
beinhaltet die Versionsnummer der Shell.
DIRSTACK
ist eine Array-Variable, die den aktuellen Verzeichnisstapel enthält. Die Reihenfolge der Einträge entspricht der von dirs angezeigten. Es ist möglich, einzelne Einträge zu verändern. Um einen neuen Eintrag zu erzeugen oder einen existierenden zu entfernen sind die Shellkommandos pushd und popd zu verwenden. Sollte DIRSTACK durch unset gelöscht werden gehen die besonderen Eigenschaften verloren, auch wenn das Array anschließend wieder erzeugt wird.
EUID
ist die effektive Benutzerkennung des Anwenders. Während der Ausführung von Programmen, bei denen das SUID-Bit gesetzt ist, wird die effektive Benutzerkennung des Eigentümers der Programmdatei gesetzt.
GROUPS
ist eine Array-Variable mit den numerischen IDs sämtlicher Gruppen, denen der User angehört.
HISTCMD
enthält die Nummer des aktuellen Kommandos so, wie sie in der History gespeichert wird.
HOSTTYPE
enthält den Hostnamen des lokalen Rechners.
HOSTTYPE
enthält eine Kennung zur Identifikation des Rechnertyps. Für Linux kommen nur die Typen `i386' und `i486' in Frage.
LINENO
enthält die aktuelle Zeilennummer im Shellscript.  Wenn die Variable innerhalb einer Scriptfunktion aufgerufen wird, entspricht die Zahl den bis zum Aufruf innerhalb der Funktion ausgeführten einfachen Kommandos. Außerhalb von Shellscripten ist diese Variable nicht sinnvoll belegt. Wenn die LINENO-Shellvariable mit dem unset-Kommando gelöscht wird, kann sie nicht wieder mit ihrer automatischen Funktion erzeugt werden.
MACHTYPE
enthält die Typenbezeichnung des Betriebssystems für das die Shell erzeugt wurde. Für Intel-Linux ist das etwas wie i586-pc-linux-gnu
OLDPWD
ist das zuletzt aktuelle Verzeichnis (wird ebenfalls vom cd-Shellkommando gesetzt).
OPTARG
enthält das Argument zu der zuletzt von getopts ausgewerteten Option (siehe getopts).
OPTIND
enthält den Index der zuletzt von getopts ausgewerteten Option (siehe getopts).
OSTYPE
enthält den Namen des Betriebssystems, also in diesem Fall `Linux'.
PIPESTATUS
ist eine Array-Variable mit den Status-Rückgabewerten aller Kommandos einer Pipeline.
PPID
ist die Prozeßnummer des Elternprozesses der Shell.
PWD
ist das aktuelle Verzeichnis, wie es vom cd- Shellkommando gesetzt wird.
RANDOM
liefert bei jeder Abfrage einen neuen Pseudozufallswert. Die Folge von Pseudozufallszahlen kann durch eine Zuweisung an RANDOM initialisiert werden. Gleiche Initialwerte führen zu gleichen Zahlenfolgen.
REPLY
wird vom Shellkommando read gesetzt, wenn keine andere Variable als Rückgabeparameter benannt ist (siehe read).
SECONDS
liefert die Anzahl von Sekunden seit dem Start der aktuellen Shell. Wenn SECONDS ein Wert zugewiesen wird, erhöht sich dieser Wert jede Sekunde automatisch um eins.
SHELLOPTS
enthält eine durch Doppelpunkt getrennte Liste aller aktiven Shelloptionen. Diese Variable kann bei der laufenden Shell nur gelesen werden. Die einzelnen Einträge lassen sich mit dem Shellkommando set -o verändern. Wird die Shellvariable in die Umgebung einer neu gestarteten Shell exportiert, übernimmt die neue Shell die Einträge vor dem Lesen anderer Initialisierungsdateien.
SHLVL
steht für den Shell-Level. Bei jedem Aufruf einer neuen Shell in der Shell wird der Shell-Level um eins erhöht. Eine Möglichkeit, zwischen den Levels zu wechseln, besteht nicht.  
UID
ist die Benutzerkennung des aktuellen Anwenders. Diese Kennung ist in der Datei /etc/passwd dem Benutzernamen zugeordnet.

Eindimensionale Arrays

  

Seit Version 2.0 unterstützt die bash eindimensionale, (nichtnegativ) numerisch indizierte Arrays. Die einzelnen Felder eines Arrays entstehen wie einfache Variable durch Zuweisung eines Wertes. Eine Deklaration und Typisierung ist möglich, aber nicht notwendig. Es gibt keine Beschränkung für die Länge eines Arrays.

Die Initialisierung eines Arrays kann durch die Zuweisung einer einzigen Liste erfolgen. Die Indizierung beginnt mit 0. Wenn bei der Initialisierung der Index nicht angegeben ist, wird automatisch der auf den höchsten bereits definerten Index folgende Wert belegt.

Bei der Verwendung von Array-Feldern muß der Bezeichner in geschweiften Klammern eingeschlossen werden, damit er von einfachen Variablen unterschieden werden kann. Die Symbole @ und * indizieren das gesamte Array. Bei der ersten Form wird immer eine Liste aller Arrayeinträge geliefert. Die zweite Form liefert eine einzige Zeichenkette mit allen Einträgen, wenn sie in Anführungszeichen eingeschlossen wird.

Das folgende Beispiel zeigt die Verwendung einer Array-Variablen:

$ farben=(BLACK RED GREEN [4]=BLUE MAGENTA CYAN WHITE)
$ echo ${farben[5]}
MAGENTA
$ farben[3]=YELLOW
$ echo ${#farben[1]}
3
$ echo ${#farben[@]}
8
$ for i in ${farben[*]}; do echo $i; done
BLACK
RED
GREEN
YELLOW
BLUE
MAGENTA
CYAN
WHITE
$ for i in "${farben[*]}"; do echo $i; done
BLACK RED GREEN YELLOW BLUE MAGENTA CYAN WHITE
$

 

Positionsparameter

   Ein Positionsparameter wird durch eine positive ganze Zahl bezeichnet, also durch Ausdrücke wie $1, $2 ...referenziert. Die Positionsparameter werden beim Aufruf der Shell in der Kommandozeile oder   durch das set-Shellkommando (mit den Optionen `-' oder `-' , siehe set) gesetzt.

Wenn ein Positionsparameter mit mehr als einer Stelle (>9) bezeichnet werden soll, muß er in geschweifte Klammern gesetzt werden: z.B. ${12}.

Spezialparameter

    Einige Parameter haben eine besondere Bedeutung. Diese Parameter können nur gelesen werden. Eine Zuweisung an diese Parameter ist verboten.
*
steht (als Parameter) für alle Positionsparameter von 1 an. In Anführungszeichen gesetzt, steht ``$*`` für ein einziges Wort, bestehend aus dem Inhalt aller Positionsparameter mit dem ersten IFS als Trennzeichen.
@
steht ebenfalls für alle Positionsparameter von 1 an. In Anführungszeichen gesetzt, wird es aber durch die Werte der einzelnen Positionsparameter (jeweils ein einzelnes Wort) ersetzt.
#
steht für die Anzahl der Positionsparameter.
?
liefert den Rückgabewert (Status) des zuletzt ausgeführten Kommandos.
-
steht für die Optionsflags (von set oder aus der Kommandozeile).
$
steht für die Prozeßnummer der Shell.
!
steht für die Prozeßnummer des zuletzt im Hintergrund aufgerufenen Kommandos.
0
steht für den Namen des Shellscripts oder der Shell selbst, wenn kein Shellscript ausgeführt wird.
_
(Unterstrich) steht für das letzte Argument des zuletzt ausgeführten Kommandos (nach allen Erweiterungen).

Erweiterung

 Nachdem die Kommandozeile in einzelne Kommandos zerlegt ist, werden die Wörter jedes einzelnen Kommandos nach Token durchsucht, die zu ersetzen sind. Es gibt acht Formen der Erweiterung:
1.
Klammererweiterung { , }
2.
Tildenerweiterung ~
3.
Parameter- und Variablenerweiterung ${  }
4.
Kommandosubstitution `   ` oder $(  )
5.
Arithmetische Erweiterung $((  )) (vor Version 2.0 $[  ])
6.
Prozeßsubstitution <(  )
7.
Worttrennung
8.
Pfadnamenerweiterung * ? [  ]

Nur durch Klammererweiterung, Worttrennung oder Pfadnamenerweiterung können neue Wörter in der Kommandozeile entstehen. Die Ergebnisse aller anderen Erweiterungen werden als einzelne Wörter interpretiert. Einzige Ausnahme ist der Spezialparameter `$@', dessen Inhalt ungeachtet von Blanks als einziges Wort behandelt wird.

Klammererweiterung

    Die Klammererweiterung generiert aus einer in geschweiften Klammern eingeschlossenen Liste von Bausteinen mehrere Zeichenketten (Wörter). Wenn die Klammer von konstanten Zeichenketten eingeschlossen ist, werden diese Zeichenketten an jedes der erzeugten Wörter angefügt. Es können mehrere Klammern verschachtelt werden.

Die dem Beispiel zur for-Schleife zugrunde liegende Aufgabe kann durch Klammererweiterung auf einer einzigen Kommandozeile formuliert werden:

$ mkdir /usr/local/man/{man,cat}{1,2,3,4,5,6,7,8,9,n,l}
$ _

Dieses Beispiel zeigt, daß im Unterschied zur Pfadnamenerweiterung hier auch neue Dateinamen erzeugt werden können.

Die Klammererweiterung wird vor allen anderen Ersetzungsoperationen durchgeführt. Es handelt sich um eine reine Textoperation, es werden keine Zeichen aus den Bausteinen verändert. Das geschieht erst in den darauf folgenden Schritten.

Mit dieser Behandlung geschweifter Klammern verhält sich die bash absichtlich anders als die Bourne-Shell, die solche Zeichen als Teil von Wörtern nicht verändert. Um die Kompatibilität zur sh wiederherzustellen, kann die Klammererweiterung durch eine Änderung der entsprechenden set-Option durch das Kommando set +o braceexpand abgeschaltet werden.

Tildenerweiterung

   Wenn ein   Wort mit einer Tilde (`~') beginnt, werden alle Buchstaben vor dem ersten Schrägstrich `/' (Slash) als Benutzername interpretiert. Diese werden dann durch den absoluten Pfad des Heimatverzeichnisses dieses Benutzers ersetzt. Wenn kein Benutzername angegeben ist, wird die Tilde durch den Inhalt der Umgebungsvariablen HOME bzw. das Heimatverzeichnis des aktuellen Anwenders ersetzt. 

Wenn der Tilde ein `+' folgt, wird das aktuelle Verzeichnis aus der Shellvariablen PWD eingesetzt. Folgt der Tilde ein `-', so wird mit dem letzten aktuellen Verzeichnis aus der Variablen OLDPWD erweitert.

Die Shell führt eine Tildenerweiterung bei der Zuweisung von Zeichenketten an Shellvariable durch. Dabei werden neben der Tilde am Wortanfang auch solche erkannt und ersetzt, die auf den Doppelpunkt `:' folgen. Auf diese Weise kann Tildenerweiterung auch für die Variablen PATH, CDPATH und MAILPATH   durchgeführt werden.

Die Tildenerweiterung findet nach der Klammererweiterung und vor allen anderen Erweiterungen statt.

Parametererweiterung

 

Das `$' Zeichen leitet Parametererweiterung, Kommandosubstitution und arithmetische Ersetzung ein. Der zu erweiternde Parameter kann in geschweiften Klammern eingeschlossen werden, um ihn von den folgenden Zeichen sicher abzugrenzen, die sonst als Teil des Variablennamens mißverstanden werden könnten.

${Parameter}
Der Wert des Parameters wird eingesetzt. Die geschweiften Klammern sind zwingend, wenn ein Positionsparameter mit mehr als einer Ziffer benannt ist oder wenn der Variablenname nicht eindeutig von den darauffolgenden Zeichen getrennt werden kann.

Die folgenden Konstruktionen stellen verschiedene Arten bedingter Parametererweiterung dar. Der mit Wort bezeichnete Teil ist seinerseits wieder Gegenstand von Tildenerweiterung, Parametererweiterung, Kommandosubstitution und arithmetischer Erweiterung. In allen Konstruktionen, die einen Doppelpunkt enthalten, wird der Parameter daraufhin getestet, ob er leer oder ungesetzt ist. Diese Konstruktionen können alle auch ohne den Doppelpunkt verwendet werden. In diesem Fall wird der Parameter nur daraufhin getestet, ob er ungesetzt bzw. gesetzt (auch leer!) ist.

Normalerweise wird eine Parametererweiterung an der Stelle im Shellscript  durchgeführt, wo der entsprechende Wert das erste Mal benutzt wird. Bei der im folgenden vorgestellten Möglichkeit, Variable mit Defaultwerten  zu belegen, ist es oft erwünscht, solche Belegungen gemeinsam an bestimmten Stellen des Scripts durchzuführen. Weil die Parametererweiterung nur als Bestandteil eines Kommandos oder einer Zuweisung durchgeführt wird, bietet sich zu diesem Zweck die :-Funktion an. Diese ,,Shellfunktion`` hat keine direkte Wirkung. Als Seiteneffekt können aber Parameter auf der Kommandozeile erweitert werden.

${Parameter:-Wort}
Benutzung von Standardwerten. Wenn der Parameter ungesetzt oder leer ist, wird das Wort anstelle des gesamten Ausdrucks eingesetzt.

${Parameter:=Wort}
Setzen von Standardwerten. Wenn der Parameter ungesetzt oder leer ist, wird der Inhalt des Wortes dem Parameter zugewiesen und der neue Parameter eingesetzt. Den Positionsparametern und den speziellen Parametern kann allerdings auch auf diese Weise kein Wert zugewiesen werden!

${Parameter:?Wort}
gibt eine Fehlermeldung, wenn der Parameter leer oder ungesetzt ist. Der Inhalt von Wort wird als Fehlermeldung auf der Standardfehlerausgabe ausgegeben und eine nichtinteraktive Shell wird verlassen. Wenn der Parameter gültig gesetzt ist, wird sein Wert eingesetzt.

${Parameter:+Wort}
erzwingt die Benutzung eines anderen Wertes. Wenn der Parameter weder leer, noch ungesetzt ist, wird der Inhalt von Wort eingesetzt. Sonst wird nichts eingesetzt.

${Parameter:Offset:Länge}
wird duch den Abschnitt mit der angegebenen Länge aus der im Parameter enthaltenen Zeichenkette ersetzt, der an der Position Offset beginnt. Offset und Länge werden zuerste nach den Regeln der Arithmetischen Erweiterung aufgelöst. Ist Offset negativ, wird der Abschnitt vom Ende der Zeichenkette abgemessen. Die Länge darf nicht negativ werden.

Ist der Parameter @, so liefert der Ausdruck eine Liste mit der durch die Länge angegebenen Anzahl Positionsparameter, beginnend mit Paremeter $Offset. Wenn der Parameter ein Array ist, wird eine Liste mit dem Inhalt der durch den Abschnitt definierten Felder geliefert.

${#Parameter}
wird durch die Anzahl der Zeichen im Parameter ersetzt. Wenn als Parameter `*' oder `@' angegeben werden, wird die gesamte Länge des erweiterten Parameters eingesetzt. Das ist die Längensumme aller Positionsparameter inklusive der Worttrenner.

${Parameter#Wort}
und
${Parameter##Wort}
  Der Anfang der im Parameter enthaltenen Zeichenkette wird mit dem erweiterten Wort verglichen und der übereinstimmende Teil aus dem Parameter entfernt. Dabei werden Jokerzeichen   (Wildcards) (`*', `?' und [...]) behandelt, wie bei der Pfadnamenerweiterung beschrieben. Im Fall der Konstruktion mit einem `#' wird das kürzeste passende Muster vom Parameter entfernt, im Fall der zwei `##' das längste.

Beispielsweise kann der Kommandoname ohne Pfadanteil aus einem absoluten Kommando durch die Konstruktion   basename=${pathname##*/} aus dem Pfadnamen in pathname extrahiert werden; eine Aufgabe, für die normalerweise das Shellutility basename benutzt wird.

${Parameter%Wort}
und
${Parameter%%Wort}
 Das Ende der im Parameter enthaltenen Zeichenkette wird mit dem erweiterten Wort verglichen und der übereinstimmende Teil aus dem Parameter entfernt. Die Jokerzeichen werden auch hier wie bei der Pfadnamenerweiterung behandelt. Bei der Konstruktion mit einem `%' wird das kürzeste passende Muster vom Parameter entfernt, bei der Konstruktion mit zwei `%%' das längste.

Beispielsweise kann analog zum vorhergehenden Beispiel der reine    Pfadanteil eines absoluten Kommandos durch die Konstruktion dirname=${pathname%/*} aus der Zeichenkette in pathname gezogen werden.

${Parameter/Muster/String}
und
${Parameter//Muster/String}
Das größte auf das Muster passende Stück der Zeichenkette im Parameter wird durch den String ersetzt. In der einfachen Variante wird nur das erste passende Teilstück, in der doppelten jedes passende Teilstück ersetzt. Wenn das Muster mit # beginnt, muß es auf den Anfang der Zeichenkette passen, wenn es mit % beginnt, auf deren Ende. Wenn der String leer ist oder der letzte Teil vollständig fehlt, werden die auf das Muster passende Stücke entfernt.

Wenn die Positionsparameter oder ein Array als Parameter übergeben werden, wird die Ersetzung auf jeden einzelnen Positionsparameter beziehungsweise jedes Feld der Arrays angewendet und eine Liste mit den resultierenden Zeichenketten zurückgeliefert.

Kommandosubstitution

  Die Kommandosubstitution ermöglicht es, die Ausgabe eines Kommandos direkt einer Shellvariablen zuzuweisen. Es gibt zwei mögliche Formen der Kommandosubstitution:

$(Kommando) und
`Kommando`

Die Kommandosubstitution wird durchgeführt, indem die Standardausgabe des Kommandos anstelle des Parameters eingesetzt wird.

Wenn die Substitution in der ,,alten`` Form mit den Apostrophen (Backquote, nicht Hochkomma) durchgeführt wird, behält das Fluchtsymbol `\' nur dann seine Sonderfunktion, wenn es vor den Zeichen `$', ` ` ' oder `\' steht. Wenn das Kommando in der Klammerform aufgerufen wird, werden alle Zeichen unverändert belassen.

Kommandosubstitution kann auch verschachtelt werden. In der ,,alten`` Form muß vor den inneren Apostrophen ein Fluchtsymbol stehen.

Wenn eine Kommandosubstitution innerhalb von Anführungszeichen durchgeführt wird, wird die Ausgabe des Kommandos nicht mehr in einzelne Wörter geteilt.

Arithmetische Erweiterung

   

Durch die arithmetische Erweiterung ist es möglich, mit Shellvariablen zu rechnen.

Durch die Konstruktion

$((Ausdruck))

wird anstelle des Ausdrucks das Ergebnis der darin formulierten arithmetischen Berechnungen eingesetzt. Außerdem wird in der Version 2.0 auch die ältere Form der Arithmetischen Erweiterung mit eckigen Klammern unterstützt:

$[Ausdruck]

Die Berechnungen werden mit `langen Ganzzahlwerten', wie sie in der Programmiersprache C verwendet werden, ausgeführt. Eine Überlaufkontrolle findet nicht statt. Die Division durch Null führt zu einem Fehler und kann mit der trap-Shellfunktion abgefangen werden.

Die folgenden Operatoren sind erlaubt (die Gruppierung entspricht der Prioritätshierarchie):

+ -
die Vorzeichen
! ~
die logische und die bitweise Negation
* / %
Multiplikation, Division und Modulo (Rest bei ganzzahliger Division)
+ -
Addition und Subtraktion
<< >>
bitweise Links- und Rechts-Shift-Operation
<= >= < >
die Vergleiche
== !=
gleich und ungleich
&
bitweise Addition
^
bitweise XOR (Exclusiv-ODER)
|
bitweise ODER
&&
logisch UND
||
logisch ODER
Zuweisungen
durch die Zuweisungsoperatoren = *= /= %= += -= <<= >>= &= ^= |= kann wie in der Programmiersprache C eine Zuweisung mit einer Rechenoperation verbunden werden; zum Beispiel der Ausdruck
let zahl=$zahl+1
kann durch den Zuweisungsoperator `+=' zu
let zahl+=1
verkürzt werden

Alle Shellvariablen sind als Operanden erlaubt. Die Berechnung macht natürlich nur Sinn, wenn es sich bei den Werten um gültige Zahlen handelt. Das Ganzzahlattribut für die Variable muß nicht gesetzt sein.

Die Operationen werden von links nach rechts (der Reihe nach) ausgeführt. Klammern werden erkannt und vorrangig behandelt.

Die kombinierten Zuweisungsoperationen sowie die logischen UND-, ODER- und Shift-Operationen gibt es erst seit bash Version 1.13.

Der Ausdruck wird behandelt, als ob er in Anführungszeichen stünde. Zusätzliche Anführungszeichen im Ausdruck werden ignoriert. Alle Wörter des Ausdrucks werden vor der Berechnung einer Parametererweiterung, Kommandosubstitution und Quotenreduktion unterzogen.

Prozeßsubstitution

    Eine dem Pipelining ähnliche Erweiterung wird durch die Prozeßsubstitution angeboten. Durch die beiden Konstruktionen
<(Subkommando)
>(Subkommando)
wird das Subkommando gestartet und sein Aus- bzw Eingabekanal mit einer automatisch erzeugten ,,named pipe`` oder FIFO-Datei verbunden. Auf der Kommandozeile wird die Konstruktion durch den Namen dieser FIFO-Datei ersetzt, so daß das eigentlich aufgerufene Kommando aus dieser Datei lesen bzw. dorthin schreiben kann.

Im Gegensatz zu einer normalen Pipeline können durch Prozeßsubstitution mehrere Pipelines gleichzeitig benutzt werden.

Die Subkommandos einer Prozeßsubstitution werden gleichzeitig mit den Parameter-, Kommando- und Arithmetikerweiterungen ausgeführt.

Worttrennung

 

Die bisher beschriebenen Erweiterungen (Parametererweiterung, Kommandosubstitution und arithmetische Erweiterung) werden vor der weiteren Bearbeitung jeweils einer Worttrennung unterzogen, wenn die erweiterten Parameter nicht in Anführungszeichen stehen.

Bei der Worttrennung wird jedes der in der Shellvariablen IFS - dem internen Feldseparator - festgelegten Zeichen als Trenner behandelt. Wenn der Inhalt der IFS-Variablen exakt SPACE TAB RETURN (die Voreinstellung) ist, wird eine beliebige Folge dieser Zeichen als ein einziger Trenner behandelt. Anderenfalls führt jeder Separator zu einem neuen Wort. Wenn die IFS-Variable leer ist, wird keine Worttrennung durchgeführt.

Leere Token, wie sie zum Beispiel durch die Erweiterung leerer Parameter entstehen, werden entfernt, wenn sie nicht ausdrücklich als leere Zeichenkette in Anführungszeichen gesetzt sind.

Wenn keine Erweiterung durchgeführt wurde, findet auch keine Worttrennung statt.

Pfadnamenerweiterung

  Im Anschluß an die Worttrennung werden alle Wörter der Kommandozeile nach den Zeichen *, ? und [ durchsucht. Jedes Wort, das ein solches Zeichen enthält, wird als Muster für eine Pfadnamenerweiterung benutzt. Es werden alle Dateien und Verzeichnisse des aktuellen Verzeichnisses mit dem Muster verglichen und anstelle des Musters eine alphabetisch[*] geordnete Liste aller passenden Pfadnamen eingesetzt.

Wenn kein passender Pfadname gefunden wurde und die Shelloption nullglob nicht aktiv ist, bleibt das Wort unverändert. Andernfalls wird es aus der Kommandozeile entfernt.

Bei der Pfadnamenerweiterung werden Datei- oder Verzeichnisnamen, die mit einem Punkt beginnen nur dann berücksichtigt, wenn die Shelloption dotglob aktiv ist. Der die Verzeichnisnamen trennende Schrägstrich `/' (Slash) kann durch kein Jokerzeichen ersetzt, sondern muß immer ausdrücklich angegeben werden.

Die Liste der durch Pfadnamenerweiterung erzeugten Token kann eingeschränkt werden, indem in der Umgebungsvariablen GLOBIGNORE eine Liste mit entsprechenden Mustern angegeben wird. Die Muster werden wie die zur Pfadnamenerweiterung selbst auf die bei er ursprünglichen Erweiterung erzeugten Token angewandt. Es werden alle Token aus der Liste entfernt, auf die ein Muster aus GLOBIGNORE paßt.

Ist GLOBIGNORE gesetzt wird automatisch auch die Shelloption dotglob aktiviert. Wird GLOBIGNORE durch unset wieder aus der Umgebung entfernt, dann wird auch dotglob wieder abgeschaltet.

Die Jokerzeichen (Wildcards) zur Pfadnamenerweiterung haben die folgende Bedeutung:  

*
paßt auf alle Zeichenketten, einschließlich der leeren Zeichenkette
?
paßt auf jedes einzelne Zeichen, außer auf das Zeilenende
[...]
paßt auf alle der in den eckigen Klammern eingeschlossenen Zeichen. Ein Paar Zeichen mit einem Minuszeichen dazwischen ist ein Bereich. Dieser Bereich enthält alle Zeichen, die nach lexikalischer Ordnung zwischen den beiden begrenzenden Zeichen angeordnet sind. Wenn das erste Zeichen ein Ausrufezeichen (`!') oder ein Caret (`^') ist, paßt das Muster auf alle Zeichen, die nicht eingeschlossen sind. Das Minuszeichen oder die eckige Klammer selbst kann in den Bereich eingeschlossen werden, indem es zusätzlich als einzelnes Zeichen vor oder nach dem Bereich angegeben wird.

Wenn die set-Option braceexpand gesetzt ist, werden in geschweiften Klammern eingeschlossene, durch Komma getrennte Listen von Wortteilen zu einer Liste von Wörtern erweitert wie in der C-Shell.

Zum Beispiel wird `*.{c,h}' zu `*.c *.h' erweitert.

Quotenreduktion

Nach allen Erweiterungen werden die unquotierten Fluchtsymbole und Apostrophe entfernt.

Synonyme

     Die bash unterhält eine Liste von Synonymen, die mit den Shellkommandos alias und unalias verwaltet werden kann. Das erste Wort jeder Kommandozeile wird daraufhin untersucht, ob es mit einem Synonym übereinstimmt. Wenn das der Fall ist, wird das Wort durch das Synonym ersetzt. Der Synonymname muß ein gültiger Name sein, der Ersetzungstext muß den Regeln der Shellgrammatik entsprechen.

Das erste Wort des Ersetzungstextes wird wieder auf ein Synonym untersucht. Es wird aber dasselbe Synonym nicht rekursiv ersetzt, so daß ein bereits existierendes Kommando über ein Synonym unter dem normalen Namen mit speziellen Optionen aufgerufen werden kann. Beispielsweise kann mit `alias ls='ls -F' ' bei jedem Aufruf von ls die Option `-F' automatisch gesetzt werden.

Wenn das letzte Zeichen des Ersetzungstextes ein Blank ist, wird das dem Synonym folgende Wort wieder auf ein Synonym untersucht.

Es gibt keine Möglichkeit, in dem Ersetzungstext Argumente zu verwenden. Wenn Argumente gebraucht werden, sollte anstelle eines Synonyms eine Scriptfunktion benutzt werden.

Synonyme werden mit dem alias-Shellkommando erzeugt und aufgelistet. Mit dem unalias-Shellkommando werden sie wieder gelöscht (siehe alias und unalias).

Synonyme sollten nicht innerhalb von Scriptfunktionen definiert werden. Außerhalb der Scriptfunktion definierte Synonyme können aber durchaus in der Scriptfunktion verwendet werden.  

Signale

  

Wenn die bash interaktiv arbeitet, ignoriert sie SIGTERM und SIGQUIT. SIGINT wird für das trap-Shellkommando abgefangen, aber nicht von der Shell selbst bearbeitet (siehe trap).

Die Signale zur Jobkontrolle SIGTTIN, SIGTTOU und SIGTSTP werden von der Shell selbst ebenfalls ignoriert.

Mit dem suspend-Shellkommando kann die Shell bis zu einem SIGCONT-Signal angehalten werden.

Hintergrundjobs ignorieren die Signale SIGINT und SIGQUIT.

Jobs, die durch Kommandosubstitution von der Shell aufgerufen wurden, reagieren nicht auf die Jobkontrollsignale SIGTTIN, SIGTTOU und SIGTSTP.

Eingabeaufforderung

     

Wenn die Shell interaktiv arbeitet und auf die Eingabe einer neuen Kommandozeile wartet, signalisiert sie ihre Bereitschaft durch die Ausgabe eines Zeichens oder einer kurzen Meldung. Diese Meldung wird auch als Prompt bezeichnet. Sie kann durch den Anwender selbst gestaltet werden. Dazu muß die gewünschte Meldung in die Shellvariable PS1 oder PS2 geschrieben werden.

Die Shell benutzt zwei Prompts für Eingabeaufforderungen. Der erste erscheint bei jeder interaktiven Eingabeaufforderung. Der zweite erscheint, wenn die Shell zur Vervollständigung eines vorangegangen Kommandos noch weitere Eingaben vom Benutzer erwartet.

Für die Gestaltung des Prompts stehen die folgenden Sonderzeichen zur Verfügung:

\a
ein Alarmton
\d
das aktuelle Datum
\e
das Escape-Zeichen
\h
der Hostname (Netzwerkname des Rechners)
\n
ein Zeilenende
\s
der Name der aktuellen Shell (Inhalt vom Parameter 0)
\t
die aktuelle Zeit im 24-Stunden-Format
\T
die aktuelle Zeit im 12-Stunden-Format
\u
der Benutzername
\v
die Versionsnummer der Shell
\V
die Versionsnummer mit Patchlevel
\w
das aktuelle Verzeichnis
\W
auch das aktuelle Verzeichnis, ohne Pfad
\@
die aktuelle Zeit im 12-Stunden-Format ohne Sekunden mit am/pm Ergänzung
\#
die (absolute) Nummer des aktuellen Kommandos
\!
die Nummer, unter der das aktuelle Kommando im Kommandozeilenspeicher geführt wird
\$
der ,,Standardprompt``. Ein $-Zeichen für normalsterbliche Anwender, ein # für die Superuserin (ruth)
\nnn
das Zeichen mit dem (oktalen) Code nnn
\\
der Backslash `\'
\[
der Anfang einer Sequenz nichdruckbarer Zeichen
\]
das Ende einer Sequenz nichdruckbarer Zeichen

Wenn alles getan ist

Wenn die Shell alle Ersetzungen in der Kommandozeile vorgenommen und alle Umleitungen vorbereitet hat, ist der Zeitpunkt gekommen, auf den der Anwender die ganze Zeit gewartet hat. Die Shell versucht, das Kommando auszuführen. Dazu muß sie es aber erst lokalisieren. Das erste passende Kommando wird ausgeführt.

Als Kommandoname wird immer das erste Wort eines einfachen Kommandos erkannt. Ein Kommandoname kann mit Pfadnamen in einem Verzeichnis (absolut oder relativ) angegeben werden. Die Shell erkennt das an (mindestens) einem Slash `/' im Kommandonamen. Wenn kein Verzeichnis angegeben ist, versucht die Shell selbst, das Kommando zu finden. Dazu wird der Kommandoname zuerst in der Hashtabelle gesucht, dann wird er mit den Synonymen, mit den Scriptfunktionen und schließlich mit den Shellfunktionen verglichen.

Wenn auf diese Weise kein Programm dieses Namens gefunden wird, werden alle in der PATH-Umgebungsvariablen aufgeführten Verzeichnisse nach einer ausführbaren Datei dieses Namens durchsucht. Wenn auch hier kein passendes Kommando gefunden wird, gibt die Shell eine Fehlermeldung aus.  

Wenn die Shell das Kommando lokalisieren kann, wird ein Argumentvektor zusammengestellt. Die Positionsvariable 0 wird mit dem vollständigen Pfadnamen des Kommandos belegt, die übrigen Argumente (wenn welche vorhanden sind) werden in den folgenden Positionsparametern gespeichert und in der Laufzeitumgebung des Kommandos, dem Environment, gespeichert. Dieser Argumentvektor kann dann beispielsweise in einem C-Programm durch die Funktion main(int argc, char* argv) übernommen und später ausgewertet werden.

Wenn die Ausführung fehlschlägt, weil die Datei keine ausführbaren Binärdaten enthält, versucht die bash automatisch, diese Datei als Shellscript  auszuführen. Dazu wird eine neue Shell (Subshell) erzeugt, die wie bei einem Aufruf in der Kommandozeile neu (durch die in der ENV-Umgebungsvariablen angegebene Datei) initialisiert wird.

Häufig beginnen Scriptprogramme mit den Zeichen `#!', gefolgt von einem Programmnamen. An dieser Konstruktion erkennt der Kernel selbst, daß es sich nicht um ein Binärprogramm handelt.[*] Beispielsweise leitet die Zeile #! /bin/bash -e ein  bash-Shellscript ein, das sofort abbricht, wenn eines der aufgerufenen Kommandos einen Status != Null liefert.

Eingebaute Shellkommandos

 

:

 

Syntax: : [Argument...]

Das Shellkommando : hat keinen direkten Effekt. Im Gegensatz zum Kommentar werden aber die ,,Argumente`` wie bei normalen Kommandos erweitert. Selbstverständlich muß das :- Shellkommando an einer für Kommandos zulässigen Position in der Kommandozeile stehen.

Seine Bedeutung hat dieses Kommando in Shellscripts,  wo bestimmte Parametererweiterungen, beispielsweise Belegung von Shellvariablen mit Default-Werten, unabhängig von einem einzelnen Kommando ausgeführt werden sollen.

alias

    

Syntax: alias [-p] [Name[=Kommando]...]

Mit dem Shellkommando alias können einfache Kommandos mit benutzerdefinierten Namen (Synonymen) belegt werden. Wenn ein Name und ein einfaches Kommando angegeben sind, wird der Name als Synonym für das Kommando gespeichert. Besteht das Kommando aus mehreren Wörtern, muß es in Hochkommata oder Anführungszeichen eingeschlossen werden.

Ohne Argument oder durch Angabe der Option -p werden alle definierten Synonyme aufgelistet. Wenn nur ein Name angegeben ist, wird das Synonym für diesen Namen angezeigt. Der Rückgabewert von alias ist Null (wahr), wenn der Name als Synonym für ein Kommando steht.

Ein mit alias definiertes Synonym kann mit unalias wieder gelöscht werden.

bg

   

Syntax: bg [Jobspezifikation]

Das Kommando bg startet einen (mit ^Z) angehaltenen Prozeß (Job) im Hintergrund. Wenn keine Jobspezifikation angegeben wurde, wird der zuletzt angehaltene Job gestartet.

Ein im Hintergrund laufender Job wird automatisch angehalten, wenn er vom Terminal lesen will.

bind

    

Syntax: bind [-m Keymap] [-lpsSvV] [-q Kommandobezeichnung] [-r Tastenfolge]

bind [-m Keymap] [-f Dateiname]

bind [-m Keymap] [Tastenfolge: Kommandobezeichnung]

Mit dem bind-Shellkommando kann die Tastenbelegung der readline-Editorfunktionen angezeigt oder neu definiert werden.

Die readline-Funktionen unterstützen mehrere Editoremulationen. Dazu werden mehrere Keymaps verwaltet.

Die Syntax einer Tastaturbelegung entspricht der für die Datei  /.inputrc.

Die Optionen haben die folgende Bedeutung:

-m Keymap
wählt die bezeichnete Befehlstabelle Keymap zur Anzeige bzw. zur Veränderung; die folgenden Keymaps werden von readline verwaltet:
emacs
emacs-standard
emacs-meta
emacs-ctlx
vi
vi-move
vi-command
vi-insert
-f Datei
liest die Tastaturbelegung aus der Datei
-l
gibt eine Liste aller möglichen Kommandobezeichnungen (readline-Funktionen) aus
-p
gibt eine Liste aller belegten Tastenkombinationen und ihrer Funktionen im Format zum Wiedereinlesen auf die Standardausgabe
-P
gibt eine informative Liste aller Kommandobezeichnungen und ihrer Belegungen aus
-q Kommando
gibt die Tastenkombination aus, die zur Ausführung des angegebenen Kommando führt
-v
gibt eine Liste der Schalter und Variablen von readline im Format zum Wiedereinlesen auf die Standardausgabe
-V
gibt eine informative Liste aller aktuellen Schalter- und Variableneinstellungen von readline aus

break

    

Syntax: break [n]

Das break-Shellkommando bricht eine for-, while- oder until-Schleife ab. Wenn eine Zahl n als Argument angegeben ist, werden n verschachtelte Schleifen abgebrochen. Ist die Anzahl größer als die Zahl der umgebenden Schleifen, werden alle umgebenden Schleifen verlassen.

builtin

     Syntax: builtin Shellkommando [Argument...]

Das Shellkommando builtin führt ein anderes eingebautes Shellkommando aus, auch wenn es durch ein Synonym oder eine gleichnamige Scriptfunktion verdeckt ist. Eine mit `enable -n' abgeschaltete Shellfunktion kann auch mit dem builtin-Kommando nicht aufgerufen werden.

bye

Wird seit Version 1.14 nicht mehr unterstützt. Siehe exit.

cd

    

Syntax: cd [-LP] [Verzeichnis]

Das Shellkommando cd dient zum Wechseln des aktuellen Verzeichnisses. Wenn kein Verzeichnis angegeben ist, wird in das HOME-Verzeichnis gewechselt. In der   Shellvariablen CDPATH kann eine Liste von   (durch Doppelpunkt getrennten) Verzeichnissen angegeben werden, in denen das Verzeichnis gesucht wird. Ein Verzeichnisname, der mit einem `/' beginnt, wird als absoluter Name behandelt und nur vom Wurzelverzeichnis aus gesucht.

Über symbolische Links können unterschiedliche Wege in das gleiche Zielverzeicunis führen. Die Shell berücksichtigt diese Möglichkeit und unterscheidet intern zwischen dem ``physischen'' und dem ``logischen'' Arbeitsverzeichnis. Normalerweise wird bei relativen Pfadangaben in der Shell immer vom logischen Arbeitsverzeichnis ausgegangen. Die Option -P führt dazu, daß beim Wechseln durch Pfade, in denen symbolischen Links enthalten sind, das aktuelle Arbeitsverzeichnis in das ``physische'' Zielverzeichnis wechselt. Dieses Verhalten kann auch generell durch das Shellattribut physical mit dem Kommando set voreingestellt werden.

Die Option -L sollte das Folgen symbolischer Links in das logische Zielverzeichnis erzwingen, auch wenn das Shellattribut physical gesetzt ist. In der Version 2.01 funktioniert dieser Schalter jedoch nicht.

Für relative Pfadangaben is das aktuelle Verzeichnis selbst unter der Bezeichnung `.' ansprechbar; das im Verzeichnisbaum nächsttiefere Verzeichnis heißt `..' und das letzte aktuelle Verzeichnis (OLDPWD) heißt `-'.

command

 

Syntax: command [-pVv] Kommando [Argument...]

Das Shellkommando command führt das angegebene (einfache) Kommando ohne die normale shellinterne Identifizierung aus. Dadurch werden nur die fest eingebauten Shellfunktionen und die Dateien aus den Verzeichnissen in PATH ausgeführt.

-p
schränkt die Suche nach dem Kommando auf den Standardpfad ein; auf diese Weise kommen nur die Standardsystemkommandos zur Ausführung
-v
(verbose) wortreich (Siehe Langenscheidts Taschenwörterbuch ,,Englisch``)
-V
(even more verbose) wortreicher ('tschuldigung)

continue

   

Syntax: continue [n]

Mit der Shellfunktion continue wird der aktuelle Schleifendurchlauf einer for-, while- oder until- Schleife sofort unterbrochen und mit dem nächsten Schleifendurchlauf angefangen. Wenn als Argument eine Zahl (größer als Null) angegeben ist, wird diese Anzahl umgebender Schleifen abgebrochen. Wenn die Zahl größer als die Zahl der umgebenden Schleifen ist, werden alle umgebenden Schleifen unterbrochen und mit dem nächsten Durchlauf der äußersten Schleife fortgefahren.

declare

       Syntax: declare [-afFirx] [-p] [Name[=Wert]]

Das Shellkommando declare erzeugt eine Shellvariable und/oder setzt die Attribute der Variablen. Wenn kein Name angegeben ist, werden die Werte aller Variablen angezeigt.

Das Kommando erlaubt folgende Optionen:

-a
deklariert eine Array-Variable
-f
gibt die vollständige Definition aller oder der angegebenen Funktionen aus
-F
gibt eine Liste von declare-Kommandos aus, mit denen alle definierten Funktionen angezeigt werden können
-i
setzt den Typ der Variablen auf Ganzzahl; wenn dieser Variablen ein Wert zugewiesen wird, findet eine arithmetische Auswertung des zugewiesenen Ausdrucks statt
-p
gibt die Belegung aller oder der angegebenen Variablen aus, alle anderen Optionen werden ignoriert
-r
setzt die Variable(n) auf `nur Lesen' Status
-x
markiert die Variable für automatischen Export in alle Subshellumgebungen

Wenn die Optionen mit `+' anstelle von `-' gesetzt werden, wird das entsprechende Merkmal abgeschaltet.

Wenn die Shellfunktion innerhalb einer Funktionsdefinition benutzt wird, ist die Variable lokal zu dieser Funktion, genauso als ob sie mit der Shellfunktion local definiert wäre.

Die typeset-Shellfunktion ist identisch mit der declare-Shellfunktion.

dirs

   Syntax: dirs [-clpv] [+n] [-n]

Die Shellfunktion dirs gibt eine Liste der im Verzeichnisstapel gespeicherten Verzeichnisse aus. Die Bearbeitung dieses Verzeichnisstapels findet mit den Shellkommandos pushd und popd statt (siehe popd).

+n
zeigt das n-te Verzeichnis vom Boden des Verzeichnisstapels an
-n
zeigt das n-te von der Spitze des Verzeichnisstapels an
-c
löscht den gesamten Verzeichnisstapel
-l
veranlaßt die Ausgabe des vollständigen Pfadnamens der sonst durch Tilde abgekürtzen Unterverzeichnisse des Heimatverzeichnisses
-p
gibt den Inhalt des Verzeichnisstapels zeilenweise aus
-v
gibt den Inhalt des Verzeichnisstapels zeilenweise mit Indexzahlen aus

disown

    Syntax: disown [-h] [Jobspezifikation]

Durch disown wird der durch die Jobspezifikation angegebene, im Hintergrund laufende Prozeß aus der Tabelle aktiver Jobs entfernt. Das führt dazu, daß der Prozeß beim Verlassen der Shell nicht mehr beachtet wird und kein SIGHUP an ihn weitergeleitet wird. Durch Angabe der Option -h wird lediglich die Weitergabe von Signalen unterdrückt, der Prozeßeintrag in der Jobtabelle bleibt aber bestehen. Wenn keine Jobspezifikation angegeben ist, wird der aktuelle Job aktuelle Job verarbeitet.

echo

   Syntax: echo [-neE] [Argument...]

Das echo-Shellkommando gibt die Argumente (durch Leerzeichen getrennt) auf die Standardausgabe. Es gibt auch ein externes echo-Kommando, das mit dem eingebauten Shellkommando der bash identisch ist.

Wenn die Option `-n' gesetzt ist, wird die Ausgabe nicht durch ein Zeilenendezeichen abgeschlossen.

Wenn die Option `-e' gesetzt ist, werden die folgenden Sonderzeichen zur Formatierung der Ausgabe erkannt:

\a
Alarm (Piep)
\b
Schritt zurück
\c
kein Zeilenende
\f
Seitenvorschub
\n
Zeilenende
\r
Wagenrücklauf
\t
(horizontaler) Tabulator
\v
vertikaler Tabulator
\\
das Zeichen `\'
\nnn
das Zeichen mit dem (oktalen) Code nnn

enable

    

Syntax: enable [-adnps] [-f Objektdatei] [Kommando...]

Das Shellkommando enable ermöglicht es, Shellfunktionen ab- und wieder anzuschalten. Auf diese Weise kann anstelle eines (internen) Shellkommandos das gleichnamige (externe) Kommando aus einem Binärverzeichnis ausgeführt werden.

Wenn die Option `-n' gesetzt ist, wird das Shellkommando abgeschaltet. Sonst wird das Shellkommando eingeschaltet.

Wenn kein Argument oder die Option `-p' angegeben ist, wird eine Liste der aktiven Shellkommandos ausgegeben. Mit der Option `-a' werden auch die abgeschalteten Shellkommandos mit aufgelistet. Die Option `-s' unterdrückt die Auflistung der nicht von POSIX vorgesehenen Shellkommandos.

Seit Version 2.0 der bash können zur Laufzeit weitere Shellfunktionen dynamisch hinzugelinkt werden. Dazu wird mit der Option `-f' der Name der Objektdatei und zusätzlich der Name für das Kommando angegeben. Mit der Option `-d' wird ein geladenes Shellkommando wieder entfernt.

eval

  

Syntax: eval [Argument...]

Das eval-Shellkommando fügt die Argumente zu einer Kommandozeile zusammen, die ausgeführt wird, ohne die Shell zu verdrängen. Sinn dieses Shellkommandos ist es, eine Kommandozeile mehrfach der Parametererweiterung zu unterziehen.

Wenn in einem Shellscript  Variablen eingesetzt werden müssen, die ihrerseits wieder Variable enthalten, oder wenn aufgrund der Reihenfolge ihrer Ausführung die gewünschte Erweiterung nicht erzielt wird, ist dieses Shellkommando das Mittel der Wahl.

exec

  

Syntax: exec [-cl] [-a Name] [Kommando] [Argument...]

Normalerweise startet die Shell ein Programm mit dem fork-Systemaufruf und wartet im Hintergrund, bis das Programm beendet wird. Danach übernimmt die Shell wieder die Kontrolle über das Terminal.

Das Shellkommando exec führt ein Kommando mit den angegebenen Argumenten aus, ohne einen Kindprozeß zu erzeugen. Das heißt, die aufrufende Shell wird verdrängt und damit beendet. Auch wenn das Kommando aus irgendwelchen Gründen nicht ausgeführt werden kann, wird die Shell beendet, wenn die Shelloption execfail ($\to$ shopt) nicht gesetzt ist.

Die Argumente werden als Optionen und Positionsparameter an das Kommando weitergegeben. Wenn die Option `-l' angegeben ist, wird ein - als nulltes (!) Argument der Kommandozeile an das Kommando weitergegeben. Das ist die Art, wie login ein Programm aufruft. Mit der Option `-l' kann ein beliebiger andere Name als nulltes Argument der Kommandozeile in die Umgebung des Kommandos eingetragen werden.

Die Option `-c' veranlaßt die Ausführung des Kommandos in einer leeren Umgebung.

Wenn kein Kommandoname angegeben ist, werden die Ein-/Ausgabe-Umleitungen, die mit dem exec-Shellkommando gegeben werden, auf die aufrufende Shell angewendet.

exit

     

Syntax: exit [n]

Das Shellkommando exit verläßt die Shell mit dem Status n. Wenn kein Status angegeben ist, wird der Status des zuletzt ausgeführten Kommandos (in der Shellvariablen `?') zurückgegeben.

Die exit-Shellfunktion erzeugt ein EXIT-Signal (0), das mit dem trap-Shellkommando abgefangen und als letzte Aktion der Shell behandelt werden kann.

Bis zur Version 1.13 konnte die Shellfunktion exit auch unter dem Namen bye aufgerufen werden.

export

    

Syntax: export [-nfp] [Name[=Wert]]

Bei der Ausführung von Programmen durch die Shell werden in der Regel neue Prozesse erzeugt. Diese Prozesse ``erben'' von der Shell eine Umgebung (Environment), in der verschiedene ,,globale`` Variablen und Funktionen enthalten sein können (siehe Shellvariable). Diese können vom Prozeß ausgewertet werden.

Es werden aber nicht alle Shellvariablen, sondern nur die besonders für den Export bestimmten Umgebungsvariablen und Funktionen aus der Shellumgebung in die Umgebung eines neuen Prozesses kopiert.

Das export-Shellkommando schreibt bereits existierende Shellvariable in die Prozeßumgebung und macht sie so zu Umgebungsvariablen. Wenn die Option `-n' gesetzt ist, wird die Variable aus der Prozeßumgebung entfernt, innerhalb der Shell bleibt sie als Shellvariable erhalten. Um Funktionen zu exportieren, muß die Option `-f' benutzt werden.

Wenn keine Namen angegeben sind oder die Option `-p' gesetzt ist, werden alle für den Export bestimmten Shellvariablen mit ihren Werten angezeigt. Eine komplette Liste aller Umgebungsvariablen können Sie sich auch mit dem printenv-Kommando anzeigen lassen. In dieser Liste werden auch die Variablen angezeigt, die die Shell beim Start mit ihrer eigenen Umgebung erhalten hat.

Wenn zu einem Variablennamen beim Aufruf von export eine Zuweisung erfolgt, wird eine existierende Variable mit diesem Wert belegt oder eine neue mit diesem Wert erzeugt.

Die mit Magnetbandgeräten arbeitenden Kommandos versuchen beispielsweise die Gerätedatei des Streamers aus der Umgebungsvariablen TAPE zu lesen. Wenn Sie beispielsweise einen (den ersten) SCSI-Streamer als Standardgerät für alle Bandoperationen bestimmen wollen, können Sie mit dem folgenden Kommando die Umgebungsvariable erzeugen:
$ export TAPE=/dev/st0
$ _

fc

   Syntax: fc [-e Editor] [-nlr] [Anfang] [Ende]
fc -s [Muster=Ersatz] [Kommandozeile]

Mit dem Shellkommando fc (fix command) können einzelne Kommandozeilen aus dem Kommandozeilenspeicher, aber auch ganze Bereiche des Kommandozeilenspeichers editiert und danach ausgeführt werden. Als Editor wird der mit der Option `-e' spezifizierte Editor benutzt oder der in der Shellvariablen FCEDIT bestimmte oder schließlich der Standardeditor vi, wenn kein anderer Editor bestimmt wird.

In der ersten Form werden die Kommandozeilen von Anfang bis Ende in den Editor geladen. Anfang und Ende können als Zeichenkette (in Übereinstimmung mit dem Anfang der gewünschten Kommandozeile) oder als Zahl (die absolute Position des Kommandos im Kommandozeilenspeicher) angegeben werden. Eine negative Zahl bestimmt Anfang und Ende relativ zum aktuellen Kommando.

Wenn kein Ende gesetzt ist, wird nur das Kommando am Anfang editiert. Wenn auch kein Anfang gesetzt ist, wird das letzte Kommando genommen.

Wenn die Option `-l' gesetzt ist, wird der entsprechende Bereich von Kommandozeilen angezeigt, anstatt ihn zu editieren. Wenn zusätzlich noch die Option `-n' gesetzt ist, wird die Ausgabe der Zeilennummern vor den Kommandozeilen unterdrückt.

Wenn die Option `-r' gesetzt ist, werden die Kommandozeilen in umgekehrter Reihenfolge in den Editor geladen.

Wenn das Shellkommando fc in der zweiten Form aufgerufen wird, ersetzt es das Muster in der Kommandozeile durch Ersatz. Wenn kein Muster/Ersatz-Paar angegeben wird, kommt die Kommandozeile unverändert zur Ausführung.

fg

    

Syntax: fg [Jobspezifikation]

Das Shellkommando fg bringt einen (mit ^Z) angehaltenen Prozeß im Vordergrund zum Laufen. Wenn keine Jobspezifikation angegeben ist, wird der zuletzt angehaltene Job im Vordergrund gestartet.

getopts

       

Syntax: getopts Optionen Variable [Argumente]

Die getopts-Shellfunktion kann in Shellscripten verwendet werden, um die Kommandozeile nach (konventionell) gültigen Optionen und Argumenten zu durchsuchen.

Wenn ein Shellscript als Kommando aufgerufen wird, kann es auf der Kommandozeile Optionen und Argumente übernehmen. Diese Parameter sind in den Positionsparametern gespeichert und können so innerhalb des Scripts angesprochen und z. B. mit einer case-Konstruktion verarbeitet werden.

Wenn die Kommandozeile den konventionellen Regeln entsprechend aufgebaut ist, kann sie einfacher mit der getopts-Shellfunktion auseinander genommen werden (siehe Regeln).

In der Zeichenkette Optionen werden alle Schalter und Regler mit ihren Kennbuchstaben angegeben. Regler, die zusätzliche Argumente erhalten, werden von einem Doppelpunkt gefolgt.

Immer dann, wenn getopts aufgerufen wird, gibt es eine Option in der beim Aufruf bezeichneten Variable zurück. Wenn diese Variable nicht existiert, wird sie erzeugt. Wenn die Option ein Argument erwartet (also mit einem Doppelpunkt markiert ist), wird dieses Argument in der Shellvariablen OPTARG zurückgegeben.

Bei jedem Aufruf von getopts wird der Zeiger in der Shellvariablen OPTIND erhöht, damit bei einem weiteren Aufruf automatisch die nächste Option eingelesen wird.

Der OPTIND wird beim Start der Shell mit 1 initialisiert. Wenn eine Kommandozeile mehrfach eingelesen werden soll, muß der Index manuell zurückgesetzt werden.

Wenn nicht ausdrücklich eine Argument-Zeichenkette beim Aufruf von getopts übergeben wird, nimmt das Shellkommando die Positionsparameter, also die Argumente von der Kommandozeile des Scripts.

Der Status von getopts ist 0 (wahr), wenn eine Option gefunden wurde und falsch, wenn das Ende der Kommandozeile bzw. der Argumente erreicht ist oder wenn ein Fehler aufgetreten ist.

Die Ausgabe von Fehlermeldungen in den Fehlerkanal kann durch Plazieren eines Doppelpunktes als erstes Zeichen der Optionen-Zeichenkette oder durch Belegung der Shellvariablen OPTERR=0 unterdrückt werden.

Zur weiteren Fehlerbehandlung kann bei der ,,stillen`` Variante in der Variablen ein symbolischer Fehlercode und in der Shellvariablen OPTARG das zuletzt gelesene Token gefunden werden.

hash

  

Syntax: hash [-r] [-p Pfadname] [Name]

Die Shell unterhält eine Hashtabelle, in der alle seit dem Start der Shell aufgerufenen (externen) Programme mit komplettem Pfadnamen gespeichert werden. Das beschleunigt jeden weiteren Aufruf eines solchen Programms, weil nicht erst auf dem Pfad danach gesucht werden muß. Wenn das Shellkommando hash mit dem Namen eines externen Programms aufgerufen wird, fügt es diesen Namen (mit Pfad) in die Hashtabelle ein.

Wenn die Option `-r' gesetzt ist, wird die Hashtabelle gelöscht. Diese Option kann notwendig sein, wenn eine Binärdatei gelöscht oder verschoben worden ist. Wenn kein Argument angegeben ist, wird der Inhalt der Hashtabelle ausgegeben.

Mit der Option `-p' kann ein Pfadname zum angegebenen Namen übergeben werden, der dann ohne weitere Suche als Hasheintrag für diesen Namen gespeichert wird.

help

   

Syntax: help [Shellkommando]

Das help-Shellkommando zeigt einen kurzen Hilfstext zu dem angegebenen Shellkommando oder, wenn kein Kommando angegeben ist, eine Übersicht aller Shellkommandos, zu denen Hilfstexte verfügbar sind.

history

   

Syntax: history [-c] [n]
history [-anrw] [Datei]

-a [Datei]
veranlaßt das Sichern der in der aktuellen Sitzung neu entstandenen History-Zeilen in das History-File bzw. in die angegebene Datei
-c
löscht alle Einträge in der History
-n [Datei]
veranlaßt das Lesen neuer Einträge aus dem History-File bzw. aus der angegebenen Datei
-p Muster
führt eine History-Expansion mit dem angegebenen Muster durch
-r [Datei]
ersetzt den Inhalt der History durch den Inhalt der Datei
-s Eintrag
hängt den angegebenen Eintrag an das Ende der History an

Anstatt den Dateinamen für das History-File als Argument zu übergeben kann dieser auch in der Shellvariablen HISTFILE festgelegt werden. Voreinstellung ist ~/.bash_history.

jobs

    Syntax: jobs [-lnprs] [Jobspezifikation]
jobs -x Kommando [Argument...]

Das Shellkommando jobs gibt eine Liste der aktuellen Jobs aus. In dieser Liste steht neben der Jobnummer zu jedem Job der Kommandoname, der Status und eine Markierung `+' für den `aktuellen Job' und `-' für den vorhergehenden aktuellen Job.

Wenn die Option `-l' gesetzt ist, wird zusätzlich die Prozeßnummer zu jedem Job ausgegeben. Mit der Option `-p' wird nur die Prozeßnummer ausgegeben. Mit der Option `-n' werden nur die Jobs angezeigt, die ihren Status seit der letzten Anzeige geändert haben. Wenn eine Jobspezifikation angegeben ist, werden nur die Daten zu diesem Job angezeigt.

Mit den Optionen `-r' und `-s' wird die Auflistung auf laufende (running) oder angehaltene (stopped) Jobs beschränkt.

Durch Angabe der Option `-x' wird das angegebene Kommando mit den Argumenten ausgeführt. Alle in den Argumenten auftauchenden Jobspezifikationen werden dabei durch die entsprechenden Prozeßnummern ersetzt und können so vom Kommando bearbeitet werden..

kill

          

Syntax: kill [-s SignalSpezifikation] [-n Signalnummer | -SignalSpezifikation [Prozeßnummer | Jobspezifikation]
kill -l [Signalnummer | -SignalSpezifikation]

Das Shellkommando kill sendet ein Signal an den durch die Prozeßnummer oder die Jobspezifikation identifizierten Prozeß. Standardsignal ist SIGTERM (15) zum Terminieren   des Prozesses. Es können aber auch beliebige andere Signale gesendet werden. Das Signal kann als Name oder als Nummer angegeben werden. Bei der Angabe des Namens kann auf den Präfix SIG verzichtet werden. Die Jobspezifikation ist hier erklärt.

Mit der Option `-l' werden alle möglichen Signalnamen aufgelistet.

Es gibt auch ein externes kill-Kommando, mit dem die gleichen Signale gesendet werden können, das aber nicht mit einer Jobspezifikation in der Kommandozeile umgehen kann.

let

  

Syntax: let Ausdruck [Ausdruck...]

Das Shellkommando let berechnet jedes Argument als arithmetischen Ausdruck. Der Rückgabewert von let ist 1, wenn der letzte Ausdruck Null liefert; sonst ist der Status Null.

Die Syntax der Ausdrücke ist hier erklärt.

local

    

Syntax: local [Name[=Wert]]

Das Shellkommando local erzeugt eine lokale Variable Name und weist ihr den Wert zu. Wenn eine lokale Variable innerhalb einer Funktion erzeugt wird, so ist sie nur innerhalb dieser Funktion und allen Unterfunktionen zugänglich. Außerhalb von Funktionen hat die Shellfunktion local keine Bedeutung.

Wenn kein Name angegeben ist, werden alle lokalen Variablen angezeigt.

logout

   

Syntax: logout

Das Shellkommando logout beendet eine Loginshell. Wenn die Shell als bash gestartet wurde, wird dabei das Shellscript `~/.bash_logout' abgearbeitet.

popd

   Syntax: popd [-n] [+|-n]

Das popd-Shellkommando löscht einen Verzeichnisnamen vom Verzeichnisstapel. Ohne Argument wird das erste (oberste) Verzeichnis vom Stapel geholt und mit cd ein Verzeichniswechsel dorthin ausgeführt. Die Option `-n' unterdrückt die Ausführung des Verzeichniswechsels, das Verzeichnis wird aus dem Stapel ohne weitere Konsequenz entfernt.

Durch Angabe der Option `+/-n' kann ein bestimmtes Verzeichnis aus dem Stapel gelöscht werden. Dabei ist die Zahl n die Position im Stapel, beginnend mit Null, und das Vorzeichen gibt an, ob das Verzeichnis vom ,,Anfang`` (links in der Liste von dirs, mit `+') oder vom ,,Ende`` (`-') aus gezählt werden soll.

Nach jedem erfolgreichen popd wird automatisch die Liste aller Verzeichnisse im Stapel wie vom Kommando dirs ausgegeben.

pushd

   Syntax: pushd [-n] Verzeichnis
pushd [-n] [+|-n]

Das Shellkommando pushd legt das Verzeichnis als oberstes auf dem Verzeichnisstapel ab oder rotiert den Verzeichnisstapel um die angegeben Positionen. Die Angabe der Option `-n' unterdrückt dabei die Ausführung des sonst üblichen Verzeichniswechsels.

Nach einem erfolgreichen Verzeichniswechsel wird automatisch die Liste aller Verzeichnisse im Stapel wie vom Kommando dirs ausgegeben.

pwd

   

Syntax: pwd [-LP]

Das Shellkommando pwd gibt den Pfadnamen des aktuellen Verzeichnisses aus. Wenn die Option `-P' angegeben ist, wird der ``physische'' Pfadname angezeigt, in dem keine symbolischen Links enthalten sind. Dieses Verhalten kann durch die set-Option physical voreingestellt werden. In diesem Fall sollte durch die Option `-L' die sonst übliche Anzeige des logischen Pfades durchgesetzt werden, in der aktuellen Version 2.01 funktioniert das jedoch nicht.

read

     Syntax: read [-er] [-a Arrayname] [-p Prompt] [Variablenname...]

Die Shellfunktion read liest eine Zeile von der Standardeingabe und weist die (durch die IFS getrennten) Wörter den benannten Shellvariablen zu. Wenn mehr Wörter in der Zeile stehen als Variablennamen angegeben sind, werden die verbleibenden Wörter alle in der zuletzt benannten Variablen gespeichert.

-e
ermöglicht das Editieren der Eingabe mit den Editorfunktionen von readline
-r
ein durch ein `\' eingeleitetes Zeilenende wird als Teil der Eingabe in einer Variablen abgespeichert
-a Array
weist die eingelesenen Werte der angegebenen Array-Variablen zu; die Variable wird vor der Belegung gelöscht und von Index 0 beginnend aufgefüllt
-p Prompt
wenn die Eingabe von einem Terminal stattfindet wird der angegebene Prompt als Eingabeaufforderung angezeigt

Wenn kein Name für die Variable angegeben ist, unter dem die Eingabe gespeichert werden soll, so wird automatisch die Shellvariable REPLY (Antwort) benutzt.

readonly

     Syntax: readonly [-afnp] [Name]

Die Shellfunktion readonly gibt Variablen (oder Scriptfunktionen mit der Option `-f') den ,,nur Lesen``-Status. Solche Variable können nicht gelöscht oder verändert werden.

Wenn kein Name angegeben ist oder die Option `-p' gesetzt ist, werden alle Variablen mit ,,nur Lesen``-Status angezeigt.

Mit der Option `-a' kann die Ausgabe der Variablenliste auf Arrays beschränkt werden.

Mit der Option `-n' können bis zur Version 1.14.2 Variable mit ,,nur Lesen``-Status wieder beschreibbar gemacht werden. Die einzige Ausnahme sind die reale und die effektive User-ID, die nicht direkt verändert werden können.

return

   Syntax: return [n]

Die return-Shellfunktion hat nur innerhalb einer Scriptfunktion eine Bedeutung und veranlaßt dort, die Funktion mit dem angegebenen Rückgabewert zu verlassen.

Wenn kein Rückgabewert angegeben ist, wird der Status des zuletzt ausgeführten Kommandos weitergereicht.

set

      

Syntax: set [-aBbCefHhknotuvx] [-o Attribut] [Positionsparameter...]

Mit dem Shellkommando set werden die Attribute der Shell zur Laufzeit verändert. Die Schalter können auch beim Aufruf der Shell auf der Kommandozeile übergeben werden.

Ohne Argumente wird eine Liste aller Umgebungsvariablen ausgegeben. Das Format ist zum Wiedereinlesen geeignet.

-a
veranlaßt die Shell, alle neu erzeugten oder veränderten Variablen automatisch zu exportieren
-B
diese Option schaltet die Klammererweiterung ein (Voreinstellung)
-b
zeigt die Beendigung eines Jobs sofort an, ohne auf die nächste Eingabeaufforderung zu warten
-C
verbietet das Überschreiben existierender Dateien durch Ausgabeumlenkung (wie noclobber)
-e
beendet die Shell sofort, wenn ein Kommando nicht den Rückgabewert Null liefert; bei zusammengesetzten Kommandos ist der Status nach der kompletten Bearbeitung entscheidend, nicht das Ergebnis eines einfachen Kommandos
-f
unterdrückt die Pfadnamenerweiterung
-H
ermöglicht den Bezug auf Zeilen im Kommandozeilenspeicher mit dem `!' wie in der csh
-h
veranlaßt die Shell die Pfadnamen der externen Programme bei ihrem Aufruf zur Beschleunigung wiederholter Ausführung in einer Hashtabelle zu speichern (Voreinstellung)
-k
veranlaßt die Shell, alle beim Aufruf eines Kommandos auf der Kommandozeile übergebenen Zuweisungen in die Umgebung zu exportieren, nicht nur die dem Programmnamen Vorhergehenden
-m
ermöglicht die Benutzung der Job-Kontrollfunktionen
-n
liest Kommandos, ohne sie auszuführen; diese Option funktioniert nicht in interaktiven Shells und dient zum Testen von Shellscripts 
-o Shelloption
setzt die angegebene Shelloption. Diese Einstellungen können auch mit dem Shellkommando shopt vorgenommen werden. Folgende Einstellungen sind möglich:
allexport
das gleiche wie die Option -a
braceexpand
in geschweiften Klammern eingeschlossene, durch Kommata getrennte Listen von Wortteilen in der Kommandozeile werden durch mehrere Wörter mit je einem eingefügten Wortteil ersetzt (wie in der C-Shell)
emacs
schaltet den Kommandozeileneditor in den emacs-Stil
errexit
das gleiche wie die Option -e
hashall
das gleiche wie die Option -h
histexpand
das gleiche wie die Option -H
hisory
ermöglicht die Verwendung der History-Funktion (Voreinstellung bei interaktiven Shells)
ignoreeof
unterdrückt das Verlassen der Shell beim Lesen von EOF mit der Wirkung von IGNOREEOF=10
keyword
das gleiche wie die Option -k
monitor
das gleiche wie die Option -m
noclobber
verbietet das Überschreiben existierender Dateien durch Ausgabeumleitung wie -C
noexec
das gleiche wie die Option -n
noglob
das gleiche wie die Option -f
notify
das gleiche wie die Option -b
nounset
das gleiche wie die Option -u
onecmd
das gleiche wie die Option -t
physical
das gleiche wie die Option -P
posix
schränkt alle Funktionen der Shell so ein, daß sie dem POSIX-Standard genügen
privileged
das gleiche wie die Option -p
verbose
das gleiche wie die Option -v
vi
schaltet den Kommandozeileneditor in den vi-Stil
xtrace
das gleiche wie die Option -x

-P
veranlaßt die Verwendung des ``physischen'' Pfades beim Wechsel in Verzeichnisse, deren Pfad symbolische Links entält
-p
(privileged) veranlaßt die Shell, beim Start die ENV- Initialisierungsdatei und die aus der Umgebung geerbten Funktionen zu ignorieren; dieser Schalter wird automatisch gesetzt, wenn die effektive User-ID nicht mit der realen übereinstimmt; beim Zurücksetzen des Schalters wird die effektive User-ID sofort mit der realen gleichgesetzt
-t
beendet die Shell sofort nach der Ausführung eines einzigen Kommandos
-u
erzeugt eine Fehlermeldung für jede leere (ungesetzte) Variable, die erweitert werden soll
-v
gibt jede Kommandozeile so aus, wie sie gelesen wurde
-x
gibt nach der Erweiterung jedes einfachen Kommandos den Inhalt der Shellvariablen PS4, gefolgt von dem erweiterten Kommando mit allen Argumenten, aus

-
setzt die Positionsparameter auf die der Option folgenden Werte, auch wenn einer der Werte mit einem `-' beginnt; wenn keine Werte folgen, werden die Positionsparameter gelöscht
-
setzt die Positionsparameter auf die der Option folgenden Werte; wenn keine Werte folgen, bleiben die Positionsparameter unverändert

Wenn anstelle des `-' bei den Optionen ein `+' gesetzt ist, wird die entsprechende Option abgeschaltet. Alle hier aufgeführten Optionen können auch beim Aufruf der Shell in der Kommandozeile gesetzt werden. Die aktuell gesetzten Optionen können mit der Shellvariablen `-' angezeigt werden (echo$-).

Wenn keine Optionen angegeben sind, werden alle Shellvariablen mit ihren Werten angezeigt.

shift

   Syntax: shift [n]

Die shift-Shellfunktion verschiebt (shiftet) die Positionsparameter um n Stellen nach links. Die herausgeschobenen Parameter sind verloren. Wenn keine Anzahl angegeben ist, wird um eine Stelle geshiftet.

shopt

  

Syntax: shopt [-pqsu] [-o] [Shelloption]

Das Shellkommando shopt dient speziell zur Veränderung unterschiedlicher Laufzeitoptionen der Shell. Zusätzlich zu den auch vom Shellkommando set verwalteten Optionen sind durch shopt weitere Einstellungen möglich.

-o
ermöglicht die Veränderung der von set verwalteten Shellattribute
-p
gibt eine Liste der Shelloptionen mit ihren Einstellungen aus
-q
(quiet) unterdrückt die Bildschirmausgabe; der Statuswert gibt an, ob eine Shelloption gesetzt ist oder nicht
-s
veranlaßt das Setzen der angegebenen Option bzw. das Auflisten aller gesetzten Optionen
-u
veranlaßt das Löschen der angegebenen Option bzw. das Auflisten aller ungesetzten Optionen

Die speziell von shopt verwalteten Shelloptionen sind:

cdable_vars
Wenn diese Option gesetzt ist, kann dem Shellkommando cd eine Shellvariable anstelle eines Verzeichnisnamen übergeben werden, aus der der Name des Zielverzeichnisses gelesen wird.
cdspell
Durch Setzen dieser Shelloption wird eine automatische Korrekturfunktion aktiviert, die kleine Tippfehler bei der Angabe des Zielverzeichnisses für cd ausgleicht.
checkhash
Wenn diese Option gesetzt ist, überprüft die bash vor dem öffnen einer in der Hashtabelle gespeicherten Programmdatei, ob dieses Programm noch an der gleichen Stelle zu finden ist. Sollte das Programm nicht mehr vorhanden sein, wird eine normale Pfadsuche durchgeführt.
checkwinsize
Wenn diese Option gesetzt ist, überprüft die bash nach jeder Kommandoausführung die Fenstergröße und paßt die Umgebungsvariablen LINES und COLUMNS an, wenn das erforderlich ist.
cmdhist
Durch Setzen dieser Option wird die bash veranlaßt, mehrzeilige Kommandos in einer einzigen Historyzeile zu speichern um die Wiederholung bzw. das Editieren dieser zusammenhängenden Befehle zu erleichtern.
dotglob
Wenn diese Option gesetzt ist, werden Dateinamen, die mit einem Punkt beginnen, in die Dateinamenerweiterung mit einbezogen.
execfail
Durch Setzen dieser Option wird verhindert, daß eine nicht-interaktive Shell nach einem Fehlgeschlagenen exec automatisch beendet wird. Interaktive Shells zeigen dieses Verhalten als Voreinstellung und können umgekehrt durch das Shellattribut errexit dazu gebracht werden, nach fehlgeschlagenem exec zu terminieren.
expand_aliases
Diese Option ist standardmäßig bei allen interaktiven Shells gesetzt und ermöglicht die Alias-Expansion.
histappend
Wenn diese Option gesetzt ist, wird beim Verlassen der Shell der Inhalt der History an die History-Datei angehängt anstatt sie zu überschreiben.
histreedit
Wenn diese Option gesetzt ist und die readline-Funktionen aktiv sind, wird die Kommandozeile nach einer fehlgeschlagenen History-Substitution nochmal im Kommandozeileneditor vorgelegt.
histverify
Nach dem Setzen dieser Option wird ein Kommando nach der History-Substitution nicht direkt ausgeführt, sondern in den Kommandozeileneditor geladen und zur interaktiven Bearbeitung angezeigt.
hostcomplete
Solange diese Option aktiv ist, wird das auf das Zeichen @ folgenden Wort bei der automatischen Kommandozeilenerweiterung als Hostname interpretiert und anhand der Daten aus /etc/hosts nach Möglichkeit ergänzt.
interactive_comments
Diese Option veranlaßt die bash, alle auf das Kommentarzeichen # folgenden Worte auch auf der Kommandozeile einer interaktiven Shell als Kommentar zu behandeln.
lithist
Zusammen mit der Option cmdhist werden zusammenhängende Zeilen eines Kommandos in der History-Datei in mehreren Zeilen abgespeichert. Normalerweise werden die Teile eines mehrzeiligen Kommandos durch Semikolon getrennt gespeichert.
mailwarn
Wenn diese Option gesetzt ist, wird eine Warnung ausgegeben, wenn der Mail-Folder von einem anderen Account zum Lesen geöffnet wurde.
nullglob
Durch Setzen dieser Option wird bei der Pfadnamenerweiterung das Ersetzen eines Musters durch Leerstrings erlaubt. In der Voreinstellung bleiben Muster, auf die kein Name paßt, unverändert in der Kommandozeile erhalten.
promptvars
Solange diese Option gesetzt bleibt, werden im Prompt-String enthaltene Variable vor der Ausgabe expandiert.
shift_verbose
Wenn diese Option gesetzt ist, gibt das Shellkommando shift eine Warnung aus, wenn versucht wird, über den letzten Positionsparameter hinauszugehen.
sourcepath
Durch Setzen dieser Option wird die bash veranlaßt, die mit dem Shellkommando source einzulesenden Shellscripts in den Verzeichnissen vom PATH zu suchen.

source

  

Syntax: source Datei

Die source-Shellfunktion läßt die Shell das Shellscript Datei abarbeiten. Dabei wird kein neuer Shell-Prozeß gestartet, sondern der Inhalt der Scriptdatei in den Eingabekanal der aktuellen Shell eingespeist. Diese Funktion kann auch durch einen einzelnen Punkt am Anfang der Kommandozeile ausgelöst werden.

suspend

   Syntax: suspend [ -f]

Die suspend-Shellfunktion veranlaßt die Shell, auf das Signal SIGCONT zu warten. Wenn die Option `-f' gesetzt ist, kann auch eine Loginshell mit dieser Funktion angehalten werden.

test

  

Syntax: test Ausdruck

[Ausdruck]

Die Shellfunktion test bewertet den Ausdruck und liefert Null, wenn der Ausdruck wahr (!) ist und Eins, wenn er falsch ist. Dieser Unterschied zu der gängigen Definition der Wahrheitswerte in C ist für die Shellprogrammierung normal! (Siehe auch im Abschnitt über den Status der Kommandos)

Ein Ausdruck kann einen einstelligen (unären) oder einen zweistelligen (binären) Operator enthalten. Einstellige Operatoren benötigen ein einziges Argument, zweistellige Operatoren stehen zwischen zwei Argumenten. Unäre Operatoren dienen oft zum Ermitteln des Zustandes einer Datei.

Außerdem können mehrere Ausdrücke noch durch spezielle Operatoren verknüpft werden.

Folgende Operationen können ausgeführt werden:

-b Datei
ist wahr, wenn die Datei ein Blockdevice ist
-c Datei
ist wahr, wenn die Datei ein Zeichendevice ist
-d Datei
ist wahr, wenn die Datei ein Verzeichnis ist
-e Datei
ist wahr, wenn die Datei existiert
-f Datei
ist wahr, wenn die Datei eine einfache Datei (plain file) ist
-g Datei
ist wahr, wenn bei der Datei das SGID Bit gesetzt ist
-k Datei
ist wahr, wenn bei der Datei das ,,sticky``-Bit gesetzt ist
-L Datei
ist wahr, wenn die Datei ein symbolischer Link ist
-p Datei
ist wahr, wenn die Datei eine benannte Pipeline (Named Pipe) ist
-r Datei
ist wahr, wenn die Datei existiert und lesbar ist
-s Datei
ist wahr, wenn die Datei existiert und größer als Null Bytes ist
-S Datei
ist wahr, wenn die Datei ein ,,Socket`` ist
-t Dateinummer
ist wahr, wenn die Datei mit der Dateinummer für ein Terminal geöffnet ist. Wenn keine Nummer angegeben ist, wird Nummer 1 (Standardausgabe) angenommen
-u Datei
ist wahr, wenn die Datei existiert und das SUID Bit gesetzt ist
-w Datei
ist wahr, wenn die Datei existiert und beschreibbar ist
-x Datei
ist wahr, wenn die Datei existiert und ausführbar ist
-O Datei
ist wahr, wenn die Datei existiert und im Eigentum des Anwenders ist, unter dessen UID das test-Shellkommando läuft
-G Datei
ist wahr, wenn die Datei existiert und im Eigentum des Benutzers ist, unter dessen GID das test-Shellkommando läuft
Datei1 -nt Datei2
(newer than) ist wahr, wenn die Datei1 neuer ist als die Datei2
Datei1 -ot Datei2
(older than) ist wahr, wenn die Datei1 älter ist als die Datei2
Datei1 -ef Datei2
(equal to file) ist wahr, wenn Datei1 und Datei2 die gleiche Inode auf dem gleichen Device belegen
-o Attribut
ist wahr, wenn das angegebene Shellattribut gesetzt ist
-z Zeichenkette
ist wahr, wenn die Länge der Zeichenkette Null ist
-n Zeichenkette
ist wahr, wenn die Länge der Zeichenkette nicht Null ist
Zeichenkette
ist auch wahr, wenn die Länge der Zeichenkette nicht Null ist, es wird also nicht der (eventuell numerische) Inhalt der Variablen getestet
Zeichenkette1 = Zeichenkette2
ist wahr, wenn die Zeichenketten gleich sind
Zeichenkette1 != Zeichenkette2
ist wahr, wenn die Zeichenketten nicht gleich sind
Zeichenkette1 < Zeichenkette2
ist wahr, wenn die Zeichenkette1 lexikalisch vor der zweiten Zeichenkette eingeordnet wird
Zeichenkette1 > Zeichenkette2
ist wahr, wenn die Zeichenkette1 lexikalisch nach der zweiten Zeichenkette eingeordnet wird
! Ausdruck
ist wahr, wenn der Ausdruck falsch ist
Ausdruck1 -a Ausdruck2
ist wahr, wenn Ausdruck1 UND Ausdruck2 wahr sind
Ausdruck1 -o Ausdruck2
ist wahr, wenn Ausdruck1 ODER Ausdruck2 wahr ist
Argument1 OP Argument2
OP steht hier für einen der arithmetischen Vergleich -eq, -ne, -lt, -le, -gt und -ge (gleich, ungleich, kleiner, kleinergleich, größer, größergleich) Der Ausdruck ist wahr, wenn die Relation von Ausdruck1 und Ausdruck2 stimmt.

time

    

Syntax: time [-p] Kommando

time führt das angegebene Kommando aus, ermittelt die Zeit, die dafür benötigt wurde und gibt diese Daten aus. Die Zeit ist aufgeteilt in real (die tatsächlich vergangene Zeit) user (die Rechenzeit im Usermodus) und sys (Rechenzeit im Kernelmodus).

Mit der Option -p werden die Zeitangaben POSIX-konform formatiert. Durch die Shellvariable TIMEFORMAT kann das Ausgabeformat für die Zeitangabe weiter angepaßt werden.

Das seit Version 2.0 von der bash intern angebotene time spielt eine Sonderrolle in dieser Auflistung von Shellkommandos. Es bildet im Prinzip das externe Programm time nach, wird also wie ein Shellkommando benutzt. Das interne time der bash wird jedoch nicht als Shellkommando behandelt, sondern als Schlüsselwort. Damit hat es den gleichen Status wie if...fi oder while...do...done. Insbesondere läßt sich das interne time nicht durch enable -n time abschalten.

Der Vorteil des internen time besteht darin, daß es die Ausführungszeit einer kompletten Pipeline messen kann. Das folgende Beispiel zeigt den Unterschied:

$ /usr/bin/time ls -l /usr/bin | sort
0.17user 0.04system 0:00.27elapsed 77%CPU (0avgtext+0avgdata 0maxresident)
0inputs+0outputs (0major+0minor)pagefaults 0swaps
-r-sr-xr-x   1 root     bin         13234 Mar 21  1997 passwd
-r-xr-xr-x   1 bin      root         3060 Jul 30 17:09 uptime
-r-xr-xr-x   1 bin      root         4912 Jul 30 17:09 watch
...
$
Das externe Kommando führt dazu, daß ein Listing von /usr/bin erzeugt und dabei die Ausführungsdauer für dieses eine Kommando ermittelt wird. Diese Zeit wird in den Fehlerkanal geschrieben und erscheint auf dem Bildschirm, noch während sort das Verzeichnislisting sortiert. Wenn als Ergebnis die gesamte Ausführungsdauer der Pipeline mit ls und sort gefragt ist, kann dieser Wert nur vom internen time ermittelt werden.

Weil die Pipeline auf der syntaktischen Ebene der Shell zusammengestellt wird, muß time auf der gleichen ebene angesiedelt sein.

times

  

Syntax: times

Das Shellkommando times gibt die verbrauchte Benutzer- und Systemzeit jeweils für die Shell und für die von der Shell aus gestarteten Prozesse an.

trap

    

Syntax: trap [-lp] [Kommando] [Signalspezifikation]

Die Shellfunktion trap fängt das angegebene Signal ab und führt das Kommando aus. Wenn kein Signal benannt ist, werden alle Signale zurückgesetzt. Wenn als Kommando die leere Zeichenkette angegeben ist, wird das damit angegebene Signal von der Shell und von allen Kommandos, die von dieser Shell ausgeführt werden, ignoriert.

Das Signal kann entweder als Zahl oder mit seinem Namen angegeben werden. Eine Liste aller möglichen Signale kann vom Shellkommando trap mit der Option `-l' ausgegeben werden.

Wenn das Signal EXIT (0) angegeben ist, wird das Kommando als letztes vor der Beendigung der Shell ausgeführt.

Wenn keine Argumente oder nur die Option `-p' angegeben sind, wird eine Liste aller ,,getrapten`` Signale und der damit verbundenen Kommandos ausgegeben.

Durch die spezielle Signalspezifikation DEBUG wird erreicht, daß das mit trap festgelegte Kommando nach jedem einfachen Kommanod ausgeführt wird.

type

   

Syntax: type [-atp] [-all] [-type | -path] [Name]

Die Shellfunktion type gibt an, wie der angegebene Name von der Shell interpretiert würde, wenn er in der Kommandozeile an der Position eines Kommandos stünde (alias, Scriptfunktion, Shellfunktion (builtin), Datei). Wenn der Name nicht gefunden wird, gibt type nichts aus.

Mit der Option -type wird nur ein Wort für den Kommandotyp entsprechend den oben genannten Möglichkeiten ausgegeben.

Wenn die Option -path benutzt wird, gibt die Shellfunktion den kompletten Pfadnamen des benannten Kommandos aus. Wenn es kein externes Kommando mit dem Namen gibt, wird nichts ausgegeben.

Die Option -all veranlaßt die Shellfunktion nicht nur die erste Fundstelle eines passenden Kommandos anzuzeigen, sondern alle möglichen. Mit der Option -path kann dabei zusätzlich die Ausgabe auf externe Kommandos eingeschränkt werden.

typeset

 Siehe declare

ulimit

   Syntax: ulimit [-SHacdfmnpstuv [Limit]]

Die Shellfunktion ulimit erlaubt die Kontrolle über die von der Shell und den daraus gestarteten Programmen benutzten Systemressourcen.

-S
setzt ,,weiche`` Grenzen; die Veränderung solcher Grenzen innerhalb des durch ,,harte`` Grenzen gegebenen Rahmens ist jederzeit möglich
-H
setzt ,,harte`` Grenzen; eine einmal gesetzte harte Grenze kann nicht nach oben erweitert werden
-a
zeigt alle eingestellten Grenzwerte an
-c
schränkt die Größe des Speicherabzugs (core) bei einem Programmabsturz ein  
-d
schränkt die maximale Größe des Datensegments jedes einzelnen Prozesses ein, der von dieser Shell aus gestartet wird; der Versuch eines Prozesses über diese Grenze hinaus Speicher zu alloziieren ist erfolglos
-f
verbietet dem Anwender, Dateien über einer bestimmten Größe zu erzeugen; ist nur im Extended-2 Filesystem implementiert
-n
schränkt die maximale Anzahl offener Dateien jedes einzelnen von dieser Shell gestarteten Prozesses ein
-m
nicht implementiert; ist dafür vorgesehen, die Größe des residenten (nicht auszulagernden) Teiles der Prozesse einzuschränken
-p
zeigt die Größe des Pipeline-Puffers (in 512 Byte Blöcken) an; dieser Wert kann nicht verändert werden
-s
schränkt den Stapelspeicher (Stack) jedes einzelnen von dieser Shell aus gestarteten Prozesses auf eine bestimmte Größe ein
-t
schränkt die verfügbare CPU-Zeit (User und System) jedes einzelnen Prozesses auf die angegebene Anzahl Sekunden ein
-u
schränkt die Anzahl der Prozesse je Benutzer ein; dabei werden auch die von anderen Shells gestarteten Prozesse des selben Benutzers mitgezählt
-v
zeigt das Gesamtlimit des virtuellen Speichers für jeden aus dieser Shell gestarteten Prozeß an

Die Grenzen werden in Kilobytes angegeben, wenn oben keine andere Einheit genannt ist. Wenn beim Aufruf keine Grenze bestimmt wird, gibt ulimit die aktuelle Grenze an.

umask

    Syntax: umask [-S] [Modus]

Die Shellfunktion umask setzt die Maske, mit der die Zugriffsrechte auf Dateien und Verzeichnisse unmittelbar nach ihrer Erzeugung durch einen von dieser Shell kontrollierten Prozeß[*] bestimmt werden. Die in der Maske gesetzten Bits werden bei den Zugriffsrechten für eine neue Datei (oder ein neues Verzeichnis) gelöscht (sie werden maskiert).

Die Maske kann als Oktalzahl oder in der beim Kommando chmod angegebenen Form angegeben werden. Wenn kein Wert angegeben ist, wird die aktuelle Maske angezeigt. Wenn die Option `-S' gesetzt ist, wird die aktuelle Maske in symbolischer Form ausgegeben.

Die Maske `022' verbietet beispielsweise allen Benutzern, außer dem Eigentümer selbst, das Schreiben in eine neu angelegte Datei oder ein Verzeichnis.

Die Abbildung 3.1 veranschaulicht die Funktionsweise von umask:

Illustration zu umask
Abbildung: Maskierung der Zugriffsrechte durch umask

Bei der Erzeugung einer Datei wird die Funktion creat(2) mit einem Wert für die Permissions aufgerufen, beispielsweise 0777. Durch die umask werden die Schreibrechte für Gruppe und Andere gelöscht. Die übrigen Rechte kommen unverändert durch die Maske und erscheinen in der I-Node der frisch erzeugten Datei.

unalias

    Syntax: unalias [-a] [Name...]

Die Shellfunktion unalias hebt ein durch das alias-Shellkommando gesetztes Synonym für ein Kommando wieder auf.

Mit der Option `-a' werden alle Synonyme gelöscht.

unset

   

Syntax: unset [-fv] [Name...]

Mit der Shellfunktion unset werden Shellvariable oder Shellfunktionen aus dem Speicher entfernt. Mit der Option `-f' wird die bezeichnete Funktion aus dem Speicher gelöscht, mit der Option `-v' die entsprechende Variable. Wenn keine der Optionen angegeben ist, wird zuerst versucht, eine Variable mit passendem Namen zu entfernen, und nur wenn dieser Versuch fehlschlägt, wird die entsprechende Funktion aus der Shellumgebung entfernt.

Eine Variable bzw. eine Funktion kann nur mit dem unset-Kommando wirklich aus dem Speicher entfernt werden. Wenn eine Variable mit der leeren Zeichenkette `` `` belegt ist, gilt sie weiterhin als gesetzt.

Die Shellvariablen PATH, IFS, PPID, PS1, PS2, UID und EUID können nicht aus dem Arbeitsspeicher der Shell entfernt werden.

wait

   Syntax: wait [Jobspezifikation | Prozeßnummer]

Die Shellfunktion wait wartet auf die Beendigung des durch die Jobspezifikation (Jobnummer oder Kommandoname) oder die Prozeßnummer angegebenen Hintergrundprozesses und gibt dessen Status aus.

Wenn kein Job spezifiziert wurde, wartet die Shellfunktion auf alle aktiven Hintergrundprozesse.  

Login- und andere Shells

  Wenn die bash mit einem `-' als erstem Zeichen des nullten Arguments aufgerufen wird (wie es das login-Kommando macht) oder wenn die Shell mit der Option -login aufgerufen wird, arbeitet sie als Loginshell.

Bei einer interaktiven Shell ist die Standardeingabe und die Standardausgabe mit einem Terminal (bzw. der Konsole) verbunden. Wenn die Shell mit der Option `-i' gestartet wird, arbeitet sie interaktiv.

Eine Loginshell arbeitet vor der ersten Kommandozeile eine Reihe von Shellscripts zur Initialisierung ab:

Beim Verlassen der Loginshell (logout) wird die Datei ~/.bash_logout abgearbeitet.

Optionen

Zusätzlich zu den beim Shellkommando set beschriebenen Optionen und Schaltern, die auch beim Aufruf der bash in der Kommandozeile verwendet werden können, versteht die bash folgende Optionen:  

-c Zeichenkette
veranlaßt die Shell, nur die Kommandos in der Zeichenkette zu bearbeiten und danach automatisch zu beenden
-i
startet die Shell interaktiv, alle Befehle werden von der Standardeingabe gelesen
-s
zwingt die Shell interaktiv zu starten, auch wenn nach den Optionen weitere Argumente folgen; dadurch können Shellvariable (Positionsvariable) über die Kommandozeile gesetzt werden

Außerdem versteht bash auch noch eine Reihe von Klartextoptionen. Diese Optionen müssen unbedingt vor allen einfachen Buchstabenoptionen gesetzt werden. Bei älteren Versionen der Shell (vor bash-2.0) werden die Klartextoptionen nur durch ein Minuszeichen eingeleitet.
-dump-strings
ist äquivalent zu -D
-help
gibt eine Übersicht zu den erlaubten Kommandozeilenoptionen aus
-login
veranlaßt den Start wie als Loginshell
-noediting
unterdrückt die Funktionen des Kommandozeileneditors (von Version 2.0 hieß diese Option -nolineediting)
-noprofile
unterdrückt beim Aufruf als Loginshell die Bearbeitung der Initialisierungsdateien /etc/profile und ~/.bash_profile
-norc
unterdrückt die Bearbeitung der Initialisierungsdatei ~/.bashrc; das ist die Voreinstellung, wenn bash unter dem Namen sh aufgerufen wird
-posix
startet die bash im POSIX-Modus
-rcfile Datei
verwendet die Datei anstelle der ~/.bashrc zur Initialisierung
-restricted
veranlaßt den Start mit eingeschänkten Shellfunktionen
-version
zeigt die Versionsnummer der Shell beim Start

Argumente beim Aufruf der Shell

Wenn nach allen Optionen weitere Argumente in der Kommandozeile stehen und weder die Option `-c' noch die Option `-s' gesetzt sind, wird das erste verbleibende Argument als Dateiname interpretiert, aus dem die weiteren Kommandos gelesen werden (Shellscript). Dieser Dateiname ist dann in der Shellvariablen `0', alle weiteren Argumente in den folgenden Positionsvariablen für die Bearbeitung im Shellscript zugänglich. Wenn alle Kommandos aus der Datei abgearbeitet sind, wird die bash automatisch beendet.

Dateien

 /bin/bash ist das ausführbare Programm.

/bin/sh ist eigentlich die Standard-Bourne-Shell. Weil die aber keine Freie Software ist, wird unter Linux meistens ein Link auf bash gesetzt.

/etc/profile ist die Standardinitialisierungsdatei für die Bourne-Shell und auch für die bash als Loginshell. Das folgende Beispiel zeigt eine /etc/profile-Datei:

export OPENWINHOME=/usr/openwin
export DISPLAY=":0"

PATH="/bin:/usr/bin:/usr/local/bin:/usr/X386/bin:$OPENWINHOME/bin"
PS2='> '

umask 022
ulimit -c 0
Wenn die bash als Loginshell gestartet wird, versucht sie, eine zusätzliche Initialisierungsdatei im Heimatverzeichnis auszuführen.

Dabei wird in der Reihenfolge nach folgenden Dateien gesucht:
~/.bash_profile
~/.bash_login und
~/.profile.
Die erste existierende Datei wird ausgeführt, die weiteren Dateien werden ignoriert. Folgendes Beispiel zeigt eine .bash_profile-Datei:

PATH=$PATH:/usr/TeX/bin:/usr/local/scripts:~/bin:.
declare -r PATH

CDPATH=~:/usr/src:/usr
PS1='\w\n\u \$ '
MAIL=/var/spool/mail/she
export EDITOR=/usr/bin/vi


HISTSIZE=200
HISTFILESIZE=100
history_control=ignoredups

alias home=cd
alias l='v -a'
alias term='term < /dev/cua1 > /dev/cua1 2> /dev/null &'

source .bashrc

~/.bashrc ist die Initialisierungsdatei für die bash als interaktive Nicht-Loginshell. Das folgende Beispiel zeigt eine sinnvolle .bashrc-Datei:

if [ $WINDOWID ]; then
  TERM=xterm
  export XDVIFONTS=/usr/TeX/lib/tex/fonts/%f.%d%p
else
  TERM=con100x40
fi

~/.bash_logout wird beim Verlassen der Login-Shell ausgeführt. Diese Datei kann beispielsweise folgende Zeilen enthalten:

sort .bash_history > .tmp
uniq .tmp > .bash_history
rm .tmp
clear

~/.bash_history ist die Sicherungsdatei für den Kommandozeilenspeicher. Der Name und die Größe können in den entsprechenden Shellvariablen eingestellt werden.

~/.inputrc enthält die benutzerdefinierten Tastaturkommandobelegungen für den Kommandozeileneditor. Inhalt und Format sind hier beschrieben.


Autoren: Brian Fox, Free Software Foundation und
		ChetRamey, Case Western Reserve University 
  


next up previous contents index
Next: cat Up: Von GNU's, Muscheln und Previous: basename

Das Linux Anwenderhandbuch
(C) 1997 LunetIX