Beim Start einer Bash lassen sich – wie bei anderen Programmen – Optionen übergeben, um grundlegende Eigenschaften der Shell oder zur Ausgabe von (Debug-) Informationen vorab einzustellen.
Viele Optionen stehen GNU-typisch sowohl als Langoptionen (--version
) als auch in Form von Kurzoptionen (-v
) gleichwertig zur Verfügung. Langoptionen lassen sich abkürzen, sofern der angegebene Teil eindeutig ist. Sie sollen in der Befehlszeile vor Kurzoptionen stehen. Dies sind die Befehlszeilenoptionen der Bash (Version 4); viele sind nur beim Auftreten von Fehlern sinnvoll:
--debugger
,--debug
. Aktiviert den erweiterten Debugger-Modus der Bash, analog zur Shelloption extdebug
(„Eingebaute Befehle, alphabetisch sortiert“); gleichzeitig wird functrace
(„Eingebaute Befehle, alphabetisch sortiert“) aktiviert.
-D
,--dump-po-strings
,--dump-strings
. Schreibt eine Liste aller PO-Strings in den Standardausgabekanal.
--version
. Gibt Versionsinformationen in den Standardausgabekanal und beendet sich erfolgreich (Rückgabewert 0
).
--help
. Kurzhilfe; zeigt die verfügbaren Langoptionen und eine Syntaxbeschreibung.
--init-file
, --rcfile
Konfigurationsdatei. Voreingestellt führt eine interaktive Bash beim Startup die Datei ~/.bashrc
aus. In ihr enthaltene Befehlszeilen bearbeitet die Shell vollständig, sofern Fehler und/oder andere Optionen dies nicht verhindern. Mit dieser Befehlszeilenoption liest die Bash eine alternative Konfigurationsdatei ein, ~/.bashrc
bleibt dann unberücksichtigt.
-l
, --login
. Startet die Bash als Login-Shell, siehe Abschnitt „Bash als Login-Shell“. Die Bash wertet dabei die zuerst gefundene Konfigurationsdatei /etc/profile
, gefolgt von ~/.bash_profile
oder ~/.bash_login
oder ~/.profile
(in dieser Reihenfolge) aus. Die Befehlszeilenoption --noprofile
verhindert das Einlesen aller Konfigurationsdateien.
--noediting
. Deaktiviert die voreingestellt aktiven Editierfunktionen der Readline-Library, auch wenn die Bash als interaktive Shell startet. Meistens ist das nicht sinnvoll.
--noprofile
. Verhindert das Einlesen und Ausführen von Konfigurationsdateien beim Startup einer Bash. Interaktive (Login-) Shells lesen weder die systemweite Konfigurationsdatei /etc/profile
, noch private ~/.bash_profile
, ~/.bash_login
oder ~/.profile
.
--norc
. Verhindert das Einlesen und Ausführen privater Konfigurationsdateien ~/.bashrc
beim Start interaktiver Shells. Dies ist voreingestellt, falls die Bash mit dem Programmnamen sh
startet.
--posix
. Aktiviert den speziellen POSIX-Modus, siehe Abschnitt „POSIX-Modus (POSIX mode)“. Das Verhalten einiger eingebauter Befehle und andere Features verändern ihr voreingestelltes Verhalten dabei.
-r
,--restricted
. Aktiviert den eingeschränkten Shellmodus, siehe Abschnitt „Eingeschränkter Shellmodus: restricted shell“. In diesem Modus bestehen aus Sicherheitsgründen nur sehr eingeschränkte Möglichkeiten.
--protected
(neu ab Version 4.3). Die Bash führt in diesem Modus keine Wortersetzungen – siehe Abschnitt „Wortersetzungen (»word expansions«)“ – durch.
-v
, --verbose
. Aktiviert die Ausgabe von Befehlszeilen so, wie sie eingelesen wurden, vor ihrer Ausführung. Ohne weitere Optionen zeigt dies die verwendeten Konfigurationsdateien an.
-c
Befehlszeile. Die Bash führt nach Auswertung anderer Optionen die im Argument von -c
angegebene Befehlszeile aus und terminiert anschließend. Diese Option sollte als letzte beim Startup angegeben werden, alle folgenden Argumente stehen als Positionsparameter (beginnend mit $0
, siehe ???) zur Verfügung.
-i
. Dies startet die Bash als interaktive Shell, aktiviert dafür die Editierfunktionen der Readline-Library und wertet als Konfigurationsdatei ~/.bashrc
aus. Die Befehlszeilenoption --norc
verhindert dies.
Beim Logout führt eine interaktive Bash den Inhalt der Konfigurationsdatei ~/.bash_logout
aus.
-s
. Eingaben vom Standardeingabekanal lesen, was automatisch geschieht, wenn Argumente (die keine Optionen sind) nach dem Auswerten der Befehlszeile übrig bleiben. Auf diese Weise lassen sich Positionsparameter beim Aufruf interaktiver Shells übergeben.
+O
Shelloption, -O
Shelloption. Die übergebenen Shelloptionen reicht die Bash an shopt
(„Eingebaute Befehle, alphabetisch sortiert“) weiter. -O
setzt die angegebene Shelloption, +O
setzt sie zurück. Bei Fehlern erscheint eine kurze Warnung.
+o
Shelloption, -o
Shelloption. Analog zu ±O
, für lange Argument von set
(„Eingebaute Befehle, alphabetisch sortiert“): übernimmt die Optionen aus der Befehlszeile.
-u
(neu ab Version 4.2). Mit der Option -u
terminieren nicht interaktive Shells bei dem Versuch, auf ungesetzte Variablen mit speziellen Variablenexpandierungen – Abschnitt „Variablenersetzungen“ – durch %
, #
, //
, ˆ
, oder durch Kommata zuzugreifen.
--
. GNU-Pseudooption. Rechts davon stehende Wörter interpretiert die Bash nicht mehr als Optionen, sondern nur noch als Argumente bzw. Positionsparameter.
Die Bash liest voreingestellt beim Startup unterschiedliche (Konfigurations-) Dateien ein, um die Kompatibilität zu möglichst vielen Shells und Systemen zu gewährleisten. Welche Konfigurationsdatei tatsächlich ausgeführt wird, hängt von zwei Faktoren ab: Dem Startup-Modus (bzw. von Befehlszeilenoptionen, die ihn aktivieren) und dem Vorhandensein der gesuchten Konfigurationsdateien. Die zuerst gefundene Konfigurationsdatei wird eingelesen und ausgewertet. Weitere Konfigurationsdateien sucht die Bash dann nicht mehr.
Achtung: Viele Konfigurationsdateien lesen mittels source
wiederum andere Konfigurationsdateien ein. So ist es beispielsweise üblich, alle interaktiven Shells mit einer speziellen Konfigurationsdatei mit gleichen Features (Funktionen, Alias-Definitionen usw.) auszustatten.
Diese sieben Fälle unterscheidet die Bash:
Interaktive Shells, die keine Login-Shells sind, suchen als Konfigurationsdatei ~/.bashrc
, sofern keine Alternative mit der Befehlszeilen-option --rcfile
(oder --init-file
) definiert wurde. --norc
verhindert das Einlesen von ~/.bashrc
.
Login-Shells suchen nach mehreren Konfigurationsdateien (in dieser Reihenfolge): /etc/profile
gefolgt von ~/.bash_profile
, ~/.bash_login
oder ~/.profile
.
Login-Shells suchen beim Terminieren nach einer Konfigurationsdatei mit dem Pfad ~/.bash_logout
. Ist sie vorhanden, führt die Bash ihren Inhalt unmittelbar vor dem Programmende aus. Die Option --noprofile
verhindert das Einlesen aller Konfigurationsdateien in diesem Modus.
Nicht interaktive Shells (»non-interactive«), die zur Ausführung von Skripten verwendeten werden, benötigen normalerweise keine Konfigurationsdatei. Die Bash wertet trotzdem die Umgebungsvariable $BASH_ENV
aus; ihren Inhalt interpretiert sie als Pfad zur einer auszuführenden Konfigurationsdatei. Die Umgebungsvariable $PATH
bleibt dabei unberücksichtigt. Das entspricht folgendem Bash-Code:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
Durch die Befehlszeilenoption -l
(bzw. --login
) verhält sich die Bash wie eine Login-Shell.
Ab Version 4.3 reagieren nicht interaktive Shells auf die durch checkwinsize
signalisierte Größenänderungen mit dem Setzen bzw. Erneuern der Umgebungsvariablen $LINES
und $COLUMNS
, nachdem der Vordergrundprozess terminiert.
Eine mit dem Programmnamen sh
gestartete Bash emuliert das Verhalten der Bourne Shell (und berücksichtigt den POSIX-Modus) weitgehend. Als Konfigurationsdatei sucht sie nach /etc/profile
und ~/.profile
, sofern dies die Befehlszeilenoption --noprofile
nicht verhindert.
Als interaktive Shell wertet eine sh
-Bash die Umgebungsvariable $ENV
(„Erweiterte Bash-Variablen“) aus und interpretiert ihren Inhalt als Konfigurationsdatei. Anschließend wechselt eine sh
-Bash in den POSIX-Modus.
Durch die Befehlszeilenoption --posix
aktiviert die Bash den POSIX-Modus. Interaktive Shells werten die Umgebungsvariable $ENV
aus, um eine Konfigurationsdatei zu ermitteln.
Remote-Shells, also Shells, die von einem (Remote-) Dämon gestartet werden, etwa rshd
, nutzen .bashrc
als Konfigurationsdatei, sofern dies nicht die Befehlszeilenoption --norc
verhindert. Die Optionen --rcfile
(oder --init-file
) erlauben es, abweichende Konfigurationsdateien zu nutzen, was aber nicht immer funktioniert.
Unterscheiden sich reale und effektive UID oder GID, und wurde die Befehlszeilenoption -p
nicht verwendet, liest die Bash keine Konfigurationsdateien ein und erbt auch keine Funktionen aus dem Eltern-Environment. Dies wird als privilegierter Modus (siehe „Privilegierter Modus“) bezeichnet.
Für Conny und Kris
Die Bourne Again Shell (ein Wortspiel in Anlehnung an die klassische Unix-Shell von Steve Bourne), kurz BASH, ist die heute wohl meistgenutzte Anwenderschnittstelle unter Linux (und Unix). Sie wird interaktiv (siehe Teil 1), oft als Login-Shell, oder in Skripten (Teil 2) als Befehlszeileninterpreter eingesetzt.
Das vorliegende Buch beschreibt die wichtigsten Features der Version 4.2 und 4.3 (beta2), die Chet Ramey basierend auf einer Arbeit von Brian Fox entwickelt hat.
Die Bash ist weitgehend POSIX-kompatibel, ist aber in vielen Modi wesentlich leistungsfähiger.
Autor und Verlag freuen sich über Rückmeldungen, Anmerkungen, Kritik usw. unter dieser E-Mail-Adresse:
kommentar@oreilly.de
Anmerkung: Die Informationen stammen aus der Bash-Manpage, der Bash-Reference, den Quelltexten und verschiedenen Quellen im Internet.
In diesem Buch gelten die folgenden typografischen Konventionen:
Kursivschrift
Neue Begriffe, Stichwörter, Dateinamen und -erweiterungen, Verzeichnisse und Ordner sind kursiv gesetzt.
Nichtproportionalschrift
Mit diesem Schrifttyp sind Codebeispiele, Ein- und Ausgaben, Befehle, Namen von Bezeichnern, dargestellt.
Nichtproportionalschrift fett
Dieser Schrifttyp dient in Beispielen und Tabellen zur Kennzeichnung von Befehlen und anderem Text, der wortwörtlich eingegeben werden soll.
Nichtproportionalschrift kursiv
Damit sind in Beispielen, Tabellen und Befehlen die Teile markiert, für die benutzerdefinierte Werte eingegeben werden sollen.
Graue Schrift
Diese kennzeichnet optionale Bestandteile von Befehlszeilen. Die in den Man-Pages verwendeten [eckigen] Klammern sind irreführend, sodass sie (meistens) entfallen müssen.
Beim Start einer Bash lassen sich – wie bei anderen Programmen – Optionen übergeben, um grundlegende Eigenschaften der Shell oder zur Ausgabe von (Debug-) Informationen vorab einzustellen.
Viele Optionen stehen GNU-typisch sowohl als Langoptionen (--version
) als auch in Form von Kurzoptionen (-v
) gleichwertig zur Verfügung. Langoptionen lassen sich abkürzen, sofern der angegebene Teil eindeutig ist. Sie sollen in der Befehlszeile vor Kurzoptionen stehen. Dies sind die Befehlszeilenoptionen der Bash (Version 4); viele sind nur beim Auftreten von Fehlern sinnvoll:
--debugger
,--debug
. Aktiviert den erweiterten Debugger-Modus der Bash, analog zur Shelloption extdebug
(„Eingebaute Befehle, alphabetisch sortiert“); gleichzeitig wird functrace
(„Eingebaute Befehle, alphabetisch sortiert“) aktiviert.
-D
,--dump-po-strings
,--dump-strings
. Schreibt eine Liste aller PO-Strings in den Standardausgabekanal.
--version
. Gibt Versionsinformationen in den Standardausgabekanal und beendet sich erfolgreich (Rückgabewert 0
).
--help
. Kurzhilfe; zeigt die verfügbaren Langoptionen und eine Syntaxbeschreibung.
--init-file
, --rcfile
Konfigurationsdatei. Voreingestellt führt eine interaktive Bash beim Startup die Datei ~/.bashrc
aus. In ihr enthaltene Befehlszeilen bearbeitet die Shell vollständig, sofern Fehler und/oder andere Optionen dies nicht verhindern. Mit dieser Befehlszeilenoption liest die Bash eine alternative Konfigurationsdatei ein, ~/.bashrc
bleibt dann unberücksichtigt.
-l
, --login
. Startet die Bash als Login-Shell, siehe Abschnitt „Bash als Login-Shell“. Die Bash wertet dabei die zuerst gefundene Konfigurationsdatei /etc/profile
, gefolgt von ~/.bash_profile
oder ~/.bash_login
oder ~/.profile
(in dieser Reihenfolge) aus. Die Befehlszeilenoption --noprofile
verhindert das Einlesen aller Konfigurationsdateien.
--noediting
. Deaktiviert die voreingestellt aktiven Editierfunktionen der Readline-Library, auch wenn die Bash als interaktive Shell startet. Meistens ist das nicht sinnvoll.
--noprofile
. Verhindert das Einlesen und Ausführen von Konfigurationsdateien beim Startup einer Bash. Interaktive (Login-) Shells lesen weder die systemweite Konfigurationsdatei /etc/profile
, noch private ~/.bash_profile
, ~/.bash_login
oder ~/.profile
.
--norc
. Verhindert das Einlesen und Ausführen privater Konfigurationsdateien ~/.bashrc
beim Start interaktiver Shells. Dies ist voreingestellt, falls die Bash mit dem Programmnamen sh
startet.
--posix
. Aktiviert den speziellen POSIX-Modus, siehe Abschnitt „POSIX-Modus (POSIX mode)“. Das Verhalten einiger eingebauter Befehle und andere Features verändern ihr voreingestelltes Verhalten dabei.
-r
,--restricted
. Aktiviert den eingeschränkten Shellmodus, siehe Abschnitt „Eingeschränkter Shellmodus: restricted shell“. In diesem Modus bestehen aus Sicherheitsgründen nur sehr eingeschränkte Möglichkeiten.
--protected
(neu ab Version 4.3). Die Bash führt in diesem Modus keine Wortersetzungen – siehe Abschnitt „Wortersetzungen (»word expansions«)“ – durch.
-v
, --verbose
. Aktiviert die Ausgabe von Befehlszeilen so, wie sie eingelesen wurden, vor ihrer Ausführung. Ohne weitere Optionen zeigt dies die verwendeten Konfigurationsdateien an.
-c
Befehlszeile. Die Bash führt nach Auswertung anderer Optionen die im Argument von -c
angegebene Befehlszeile aus und terminiert anschließend. Diese Option sollte als letzte beim Startup angegeben werden, alle folgenden Argumente stehen als Positionsparameter (beginnend mit $0
, siehe ???) zur Verfügung.
-i
. Dies startet die Bash als interaktive Shell, aktiviert dafür die Editierfunktionen der Readline-Library und wertet als Konfigurationsdatei ~/.bashrc
aus. Die Befehlszeilenoption --norc
verhindert dies.
Beim Logout führt eine interaktive Bash den Inhalt der Konfigurationsdatei ~/.bash_logout
aus.
-s
. Eingaben vom Standardeingabekanal lesen, was automatisch geschieht, wenn Argumente (die keine Optionen sind) nach dem Auswerten der Befehlszeile übrig bleiben. Auf diese Weise lassen sich Positionsparameter beim Aufruf interaktiver Shells übergeben.
+O
Shelloption, -O
Shelloption. Die übergebenen Shelloptionen reicht die Bash an shopt
(„Eingebaute Befehle, alphabetisch sortiert“) weiter. -O
setzt die angegebene Shelloption, +O
setzt sie zurück. Bei Fehlern erscheint eine kurze Warnung.
+o
Shelloption, -o
Shelloption. Analog zu ±O
, für lange Argument von set
(„Eingebaute Befehle, alphabetisch sortiert“): übernimmt die Optionen aus der Befehlszeile.
-u
(neu ab Version 4.2). Mit der Option -u
terminieren nicht interaktive Shells bei dem Versuch, auf ungesetzte Variablen mit speziellen Variablenexpandierungen – Abschnitt „Variablenersetzungen“ – durch %
, #
, //
, ˆ
, oder durch Kommata zuzugreifen.
--
. GNU-Pseudooption. Rechts davon stehende Wörter interpretiert die Bash nicht mehr als Optionen, sondern nur noch als Argumente bzw. Positionsparameter.
Die Bash liest voreingestellt beim Startup unterschiedliche (Konfigurations-) Dateien ein, um die Kompatibilität zu möglichst vielen Shells und Systemen zu gewährleisten. Welche Konfigurationsdatei tatsächlich ausgeführt wird, hängt von zwei Faktoren ab: Dem Startup-Modus (bzw. von Befehlszeilenoptionen, die ihn aktivieren) und dem Vorhandensein der gesuchten Konfigurationsdateien. Die zuerst gefundene Konfigurationsdatei wird eingelesen und ausgewertet. Weitere Konfigurationsdateien sucht die Bash dann nicht mehr.
Achtung: Viele Konfigurationsdateien lesen mittels source
wiederum andere Konfigurationsdateien ein. So ist es beispielsweise üblich, alle interaktiven Shells mit einer speziellen Konfigurationsdatei mit gleichen Features (Funktionen, Alias-Definitionen usw.) auszustatten.
Diese sieben Fälle unterscheidet die Bash:
Interaktive Shells, die keine Login-Shells sind, suchen als Konfigurationsdatei ~/.bashrc
, sofern keine Alternative mit der Befehlszeilen-option --rcfile
(oder --init-file
) definiert wurde. --norc
verhindert das Einlesen von ~/.bashrc
.
Login-Shells suchen nach mehreren Konfigurationsdateien (in dieser Reihenfolge): /etc/profile
gefolgt von ~/.bash_profile
, ~/.bash_login
oder ~/.profile
.
Login-Shells suchen beim Terminieren nach einer Konfigurationsdatei mit dem Pfad ~/.bash_logout
. Ist sie vorhanden, führt die Bash ihren Inhalt unmittelbar vor dem Programmende aus. Die Option --noprofile
verhindert das Einlesen aller Konfigurationsdateien in diesem Modus.
Nicht interaktive Shells (»non-interactive«), die zur Ausführung von Skripten verwendeten werden, benötigen normalerweise keine Konfigurationsdatei. Die Bash wertet trotzdem die Umgebungsvariable $BASH_ENV
aus; ihren Inhalt interpretiert sie als Pfad zur einer auszuführenden Konfigurationsdatei. Die Umgebungsvariable $PATH
bleibt dabei unberücksichtigt. Das entspricht folgendem Bash-Code:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
Durch die Befehlszeilenoption -l
(bzw. --login
) verhält sich die Bash wie eine Login-Shell.
Ab Version 4.3 reagieren nicht interaktive Shells auf die durch checkwinsize
signalisierte Größenänderungen mit dem Setzen bzw. Erneuern der Umgebungsvariablen $LINES
und $COLUMNS
, nachdem der Vordergrundprozess terminiert.
Eine mit dem Programmnamen sh
gestartete Bash emuliert das Verhalten der Bourne Shell (und berücksichtigt den POSIX-Modus) weitgehend. Als Konfigurationsdatei sucht sie nach /etc/profile
und ~/.profile
, sofern dies die Befehlszeilenoption --noprofile
nicht verhindert.
Als interaktive Shell wertet eine sh
-Bash die Umgebungsvariable $ENV
(„Erweiterte Bash-Variablen“) aus und interpretiert ihren Inhalt als Konfigurationsdatei. Anschließend wechselt eine sh
-Bash in den POSIX-Modus.
Durch die Befehlszeilenoption --posix
aktiviert die Bash den POSIX-Modus. Interaktive Shells werten die Umgebungsvariable $ENV
aus, um eine Konfigurationsdatei zu ermitteln.
Remote-Shells, also Shells, die von einem (Remote-) Dämon gestartet werden, etwa rshd
, nutzen .bashrc
als Konfigurationsdatei, sofern dies nicht die Befehlszeilenoption --norc
verhindert. Die Optionen --rcfile
(oder --init-file
) erlauben es, abweichende Konfigurationsdateien zu nutzen, was aber nicht immer funktioniert.
Unterscheiden sich reale und effektive UID oder GID, und wurde die Befehlszeilenoption -p
nicht verwendet, liest die Bash keine Konfigurationsdateien ein und erbt auch keine Funktionen aus dem Eltern-Environment. Dies wird als privilegierter Modus (siehe „Privilegierter Modus“) bezeichnet.
Interaktive Shells expandieren zunächst die Umgebungsvariable $PROMPT_COMMAND
und präsentieren danach den Inhalt von $PS1
als Eingabeaufforderung. Für Details siehe den Abschnitt Abschnitt Kapitel 4. Der Anwender kann nun eine Befehlszeile eingeben, editieren, auf vorherige zurückgreifen, Teile aus ihnen extrahieren und in die aktuelle einfügen usw. Die Readline- und Historylibrary machen dies und vieles mehr möglich. Mit [Return
], [Enter
], [Ctrl
][j
] oder [Ctrl
][m
] beendet der Anwender die manuelle Bearbeitung und übergibt die Befehlszeile an die Bash. Diese wertet die Befehlszeile nach festen Regeln aus. Dazu zerlegt sie die Zeile in Token, führt Expandierungen – siehe Abschnitt Kapitel 8 – und Redirections – siehe Abschnitt Kapitel 5 – durch, ersetzt Variablen usw. Die Reihenfolge ist dabei wie folgt:
Klammerexpandierung, siehe dazu Abschnitt „Klammerexpandierungen (»brace expansions«)“
Tildeersetzungen, siehe Abschnitt „Tildenersetzungen“
Parameter- und Variablenersetzung, siehe Abschnitt „Parameterersetzungen“ und („Befehlsersetzungen“)
Befehlssubstitution, meistens auch Prozesssubstitution, siehe Abschnitt „Befehlsersetzungen“ und („Prozessersetzungen (Process substitution)“)
Arithmetische Expandierungen, siehe Abschnitt „Arithmetische Ausdrücke (Arithmetic expressions)“
Wortersetzungen, siehe Abschnitt „Wortersetzungen (»word expansions«)“
Dateinamenexpandierungen, siehe Abschnitt „Dateinamenexpandierungen (File Name Matching/Pattern Matching).“
Klammerexpandierungen, Wort-, Prozessersetzungen sowie Dateinamenexpandierungen verändern die Wortzahl in Befehlszeilen.
Die Bash erlaubt auf mehrere Arten Befehle miteinander zu verbinden. Wenn dabei keine Pipe – siehe Abschnitt „Pipe(line)s“ – zum Einsatz kommt, wird die Verbindung von Befehlen als Liste bezeichnet. Es gibt es folgende Möglichkeiten:
»;
«: Verbinden durch Aneinanderhängen. Dies ist eine Variante der Befehlszeilenbearbeitung. Nach dem Ende der ersten Zeile (bis zum Semikolon) bearbeitet die Bash die folgende Zeile (die wieder bis zum nächsten Semikolon oder Zeilenende reicht). Die einem Semikolon folgende Zeile führt die Bash immer aus, unabhängig vom Ergebnis der vorhergehenden.
Dieses Shellfeature macht es erforderlich, in Argumenten von find
das Semikolon zu maskieren: find ... -exec ... \;
»&&
«: logisches UND oder abhängige Ausführung; die Bash führt die zweite Befehlszeile (ab &&
) nur aus, wenn der erste Befehl erfolgreich war (Rückgabewert Null).
»||
«: logisches ODER, bzw. alternative Ausführung; die Bash führt die zweite Befehlszeile (ab ||
) nur aus, wenn ein Fehler in der vorigen Befehlszeile (Rückgabewert ungleich Null) aufgetreten ist.
»&&
« und »||
« werden auch als short circuit-Tests bezeichnet, der Rückgabewert des letzten Befehls bestimmt den der Liste. Eine Kombination beider Tests ist möglich, siehe auch Abschnitt „Kontrollstrukturen“:
cd /root/bin && ls || echo ERROR
Eine Befehlsgruppe fasst mehrere Befehle so zusammen, dass die Bash sie als Einheit behandelt. Damit lassen sich Redirections auf die gesamte Einheit anwenden. Der Rückgabewert des letzten ausgeführten Befehls bestimmt den der Liste.
Den einfachsten Fall bildet die Ausführung in einer Subshell. Runde Klammern in der Befehlszeile interpretiert die Bash als Aufforderung, eine Subshell zu starten:
(
␣ Befehlszeile(n) ␣)
Die Leerzeichen an den Klammern (hier mit gekennzeichnet) sind obligatorisch. Alle in den eingeklammerten Befehlszeilen enthaltenen Befehle führt die Bash in einer Subshell aus, die erst nach dem Ende des letzten Befehls terminiert. Veränderungen am Environment der Subshell gehen dann verloren und haben keinen Einfluss auf die aufrufende Shell.
Alternativ lässt sich eine Befehlsgruppe in der aktuellen Shell ausführen. Dies zeigen geschweifte Klammern an:
{
Befehlszeile(n); ␣}
Leerzeichen an den Klammern und das Semikolon am Ende sind obligatorisch. In diesem Fall startet die Bash keine Subshell, Veränderungen am Environment bleiben bestehen.
Pipelines (kurz: Pipes) verbinden zwei Befehle (die dann als »Filter« arbeiten) in einer Befehlszeile so, dass der Standardausgabekanal des ersten direkt mit dem Standardeingabekanal des zweiten verbunden ist. Dies ermöglicht eine sehr effektive Datenverarbeitung. Das Symbol |
zeigt dies an, siehe auch time
(„Eingebaute Befehle, alphabetisch sortiert“):
Befehl1 |
Befehl2 ...
Pipes können im Prinzip beliebig lang werden; neben eingebauten und externen Befehlen lassen sich auch Funktionen, Shellskripts und Befehlsblöcke verwenden. Sofern die Pipe nicht mit &
asynchron ausgeführt wird, wartet die Bash auf das Ende aller Befehle, bevor eine neue Befehlszeile bearbeitet wird.
In Shellskripten (aber auch in interaktiven Shells) dürfen Zeilen mit |
beendet werden, ohne dass dies die Pipeline unterbricht:
...
Befehl1 |
Befehl2 ...
Alle Befehle einer Pipeline führt die Bash in Subshells aus. Den Rückgabewert einer Pipeline übernimmt diese vom letzten ausgeführten Befehl, sofern die Shelloption pipefail
nicht aktiviert ist. In diesem Fall wird der letzte von Null verschiedene Returncode zurückgegeben – oder Null, falls keine Fehler auftraten. Ein führendes Ausrufezeichen negiert den Rückgabewert einer Pipeline.
Anmerkungen: In manchen Situationen ist es gut, die innerhalb einer Pipeline weitergegebenen Daten auch darstellen zu können (ohne die Bearbeitung zu unterbrechen). Der (externe) GNU-Befehl tee
erlaubt dies:
...
Befehl1 | tee|
Befehl2...
Mit dem Schlüsselwort time
(„Eingebaute Befehle, alphabetisch sortiert“) ermöglicht die Bash, statistische zeitliche Informationen über die Bearbeitung in der Pipe anzuzeigen.