Aus LinuxUser 11/2000

Hardcore Linux

Die Bash, das unbekannte Wesen

Dieser Teil der Serie über die Bash stellt die Grundlagen für die Arbeit mit mehreren und verketteten Befehlen auf der Bash zusammen.

Ein Überblick

Kleine Programme, die auf einer Shell ausgeführt werden, heißen „Befehle“ („Commands“). So unterschiedlich ihre Funktionen auch sind, weisen sie doch gewolltermaßen und prinzipiell viele Ähnlichkeiten auf. So verfügt jeder Befehl über drei Ein- und Ausgänge, die für bestimmte festgelegte Aufgaben eingesetzt werden, die Standardkanäle. Befehle können in den Befehlszeilen einzeln, zu mehreren oder in verketteter Form eingegeben werden. Alle Formen haben bestimmte Vorteile und Eigenheiten.

Befehle und Standardkanäle

Abbildung 1: Datenfluss und Standardkanäle
Abbildung 1: Datenfluss und Standardkanäle

Einer der Befehlskanäle stellt dem Befehl ein Tor für Eingaben zur Verfügung. Über ihn liest ein Programm Daten aus einer Datei oder einer Pipe (siehe unten) ein. Dieser Kanal wird daher als „Standardeingabe“ (standard input) bezeichnet. Analog gibt es einen Ausgabekanal, die „Standardausgabe“ (standard output). Der dritte Kanal („Standardfehlerausgabe“ – standard error) hat eine besondere Funktion: über ihn werden Fehlermeldungen, die der Befehl generiert, ausgegeben. Diese Fehlermeldungen haben unter Linux eine wichtige Funktion, da sie oft Hinweise enthalten, wie ein Problem zu lösen ist. Ein Beispiel: Mit den Befehl grep werden Texte nach bestimmten Zeichenketten durchsucht. Der Befehl muss dazu die Textdaten aus den Dateien erhalten (via Standardeingabekanal). Zeilen, die den entsprechenden Text enthalten, werden ausgegeben (via Standardausgabekanal) und in Fällen, wo ein Problem auftritt – weil etwa eine nicht lesbare Datei angegeben wurde – muss der Befehl dies über die Standardfehlerausgabe melden. Abbildung 1 verdeutlicht die Zusammenhänge. Die Zahlen „0“, „1“ und „2“ dienen zur Kennzeichnung dieser Kanäle und werden als Datei-Descriptoren bezeichnet. In der Befehlszeile sieht der Anwender nur wenig von diesen Zusammenhängen:

$> grep muster textdatei*
grep: textdatei: Ist ein Verzeichnis
textdatei1.tex: ein Beispiel "muster"
...

Dieses Beispiel zeigt verschiedene Aspekte auf: Zum einen verwenden viele Befehle (wie auch grep) einige Argumente in der Befehlszeile für Eingaben. Derartige Befehle verwenden meistens das Terminal zur Eingabe, wenn keine entsprechende Eingabedatei beim Befehlsaufruf angegeben wurde.

$> grep geh
Das Lesen vom Terminal[RETURN]
geht so!
geht so!
[Strg-d]

(„geht“ wird als Suchmuster interpretiert. Mit [Strg][d] wird das Dateiende gekennzeichnet und so die Eingabe beendet.)

Zum anderen wird in dem Beispiel oben das letzte Argument in der Befehlszeile (textdatei*) als Name der Eingabedatei interpretiert. Da der Dateiname ein Sternchen enthält, ersetzt die Shell ihn durch alle passenden Dateinamen (beispielsweise textdatei1.tex, textdatei2.tex, …). Da es auch ein Verzeichnis mit dem Namen „textdatei“ gibt, versucht grep zunächst auf dieses zuzugreifen, ein Versuch, der zum Scheitern verurteilt ist und die in der ersten Ausgabezeile dargestellte Fehlermeldung verursacht. Im folgenden sieht man, dass die Textausgaben (also die Zeilen, auf die das angegebene Muster zutraf) auch auf dem Terminal erscheinen. Grund für dieses Verhalten ist die Tatsache, dass normalerweise sowohl Standardausgabe- als auch Standardfehlerkanal auf das Terminal geleitet werden. Das muss aber nicht so sein. Über die Datei-Descriptoren sind beide Kanäle getrennt zugänglich.

Ein- und Ausgabeumleitungen

Der Zugriff auf die Standardkanäle erfolgt über sogenannte „Redirections“- (Umleitungs-) Operatoren. In ihrer einfachsten Form werden sie durch die Zeichen „<“ und „>“ repräsentiert.

$> befehl < Eingabe
befehl > Ausgabe

Im ersten Beispiel erhält der Befehl seine Eingabe über den Standardeingabekanal aus der Datei Eingabe, im zweiten wird die Ausgabe via Standardausgabekanal in die Datei Ausgabe geleitet. Dies sind nur zwei einfache Beispiele für den Einsatz von Datei-Descriptoren und Redirections. Bei grep bietet sich z.B. folgende Konstruktion an:

$> grep muster textdatei* 1>ausgabe 2>fehler

Mit dieser Befehlszeile werden Standardausgabe und Standardfehler in zwei getrennte Dateien geleitet, oft ist es das, was der Anwender will. Datei-Descriptor „1“ repräsentiert den Ausgabekanal, „2“ den Standardfehlerkanal. (Der Standardeingabekanal wird entsprechend durch „0“ repräsentiert.) Voreingestellt ist für die Ausgabe die Verwendung des Datei-Descriptors 1. Daher kann die Angabe dieser Nummer entfallen, beide Zeilen in folgendem Beispiel sind identisch.

$> grep muster textdatei* > Ausgabe
grep muster textdatei* 1> Ausgabe

Ganz allgemein können die Nummern von Datei-Descriptoren vor dem Umleitungsoperator angegeben werden. Die Umleitung bezieht sich dann auf den durch den Operator beschriebenen Kanal.

Anmerkung: Wird ein Datei-Descriptor explizit angegeben, so muss der Nummer das Operatorzeichen unmittelbar folgen. Leerzeichen dazwischen sind verboten! Für die Eingabe gilt entsprechendes: Voreingestellt ist der Kanal 0, dessen Nummer nicht explizit genannt werden muss. Zwei Kanäle (üblicherweise Standardfehler und Standardausgabe) lassen sich auch so zusammenschalten, dass sie einen gemeinsamen Datenstrom erzeugen:

grep muster textdatei* 2&>1
grep muster textdatei* 2> 1&> gesam
grep muster textdatei* 2&> gesam
grep muster textdatei* &> gesam

In der ersten Zeile erfolgt die Ausgabe via Standardfehlerkanal („2“) dahin, wohin auch Standardausgabe („1“) geleitet wird. In der zweiten Zeile werden explizit beide Kanäle in die Datei gesamt geleitet. Die dritte Zeile zeigt eine oft verwendete Variante, bei der der Datei-Descriptor für den Standardausgabekanal weggelassen wurde. Das ist korrekt, da diese Angabe voreingestellt ist. Entsprechendes gilt auch für die letzte Variante, hier wurde zusätzlich der Datei-Descriptor für den Standardfehlerkanal eingespart.

Es gibt noch eine Reihe von weiteren Möglichkeiten, Datei-Descriptoren auf der Bash einzusetzen. So können mit dem (eingebauten) Bashbefehl exec zusätzliche Dateien über neue Datei-Descriptoren zugänglich gemacht werden.

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

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: