In der Praxis leiten Sie so komfortabel Daten in verschiedene Dateien oder Geräte um. Tabelle “File-Deskriptoren” zeigt die Regeln für die zusätzlichen Kanäle. Bei Kanälen zum Lesen und Schreiben gilt es, beide Schritte zum Aufheben vorzunehmen.
File-Deskriptoren
|
Anweisung |
Aktion |
|---|---|
|
|
Ausgabekanal anlegen |
|
|
Eingabekanal anlegen |
|
|
Ein/Ausgabekanal anlegen |
|
|
Ausgabe auf Kanal |
|
|
Ausgabekanal aufheben |
|
|
Eingabekanal aufheben |
Hier hängen Sie Ausgaben ebenfalls an bestehende Dateien an, indem Sie das Zeichen > doppelt verwenden. Nicht mehr benötigte Deskriptoren sollten Sie unbedingt wieder aufheben. Ein selbsterklärendes Anwendungsbeispiel finden Sie in Listing 13.
Listing 13
#! /bin/bash # Testdateien erzeugen echo -e "erste\nzweite\ndritte\n" > eingabe.txt echo -e "eins\nzwei\ndrei\n" > puffer.txt echo "Das ist lesbar" # Anlegen Ausgabekanal 3: exec 3>zieldatei2.txt # Anlegen Eingabekanal 4: exec 4<eingabe.txt # Anlegen Ein-/Ausgabekanal 5: exec 5<>puffer.txt # Setzen Umleitung stdout und stderr exec >zieldatei1.txt 2>fehlerlog echo "Das kommt in die Datei" # Ausgabe über Kanal 3 echo "Das kommt in die andere Datei" >&3 echo "Die einzelne Anweisung zur Umleitung ist nicht nötig!" # Erzeugen einer Fehlermeldung ls neuedatei.txt # Auslesen aus Kanal 4 und schreiben auf Kanal 3: read A <&4 echo $A >&3 # Benutzung der Datei puffer.txt tail -1 <&5 echo "Neue Zeile" >&5 # Schließen zusätzlicher Kanäle: exec 3>&- exec 4<&- exec 5<&- exec 5>&-
Tests für die Shell
Das Paket coreutils enthält ein Werkzeug namens Test, um Entscheidungen auf der Basis von Tests zu treffen. Es wertet das Zutreffen bestimmter Bedingungen aus; als Kriterien kommen Vergleiche von Zahlen, Zeichenketten oder Eigenschaften von Objekten im Verzeichnisbaum des Rechners infrage.
Der Befehl kennt zwei unterschiedliche Formen der Syntax. In der Klammerform, die in der Praxis häufig vorkommt, steht die Anweisung innerhalb eckiger Klammern (if [ $? -eq 0 ]). Beachten Sie, dass zwischen der eckigen Klammer und dem Inhalt ein Leerzeichen stehen muss. In der ausgeschriebenen Form fallen die eckigen Klammern weg (if test $? -eq 0).
Der Befehl gibt einen Exit-Code aus. Die steht dabei für “wahr”, die 1 für “falsch”. Es gibt die Möglichkeit, Ausdrücke zu negieren. Das signalisieren Sie durch ein mit Leerzeichen abgetrenntes, vorangestelltes Ausrufezeichen ([ ! -e Datei ]). Die Tabelle “Test-Varianten” liefert eine Übersicht über die Möglichkeiten des Tools.
Test-Varianten
|
Ausdruck |
Erläuterung |
|---|---|
|
Vergleichen von Zeichenketten |
|
|
|
wahr, wenn Variable |
|
|
wahr, wenn Variable |
|
|
wahr, wenn die Länge der Zeichenkette in |
|
|
wahr, wenn der Inhalt beider Variablen gleich ist |
|
|
wahr, wenn der Inhalt der beiden Variablen ungleich ist |
|
Vergleichen von ganzen Zahlen |
|
|
|
wahr, wenn die Werte gleich sind |
|
|
wahr, wenn die Werte ungleich sind |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
Eigenschaften von Objekten |
|
|
|
wahr, wenn |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
|
wahr, wenn für |
|
|
wahr, wenn für |
|
|
wahr, wenn für |
|
|
wahr, wenn die Größe von |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
|
wahr, wenn das Leserecht für |
|
|
wahr, wenn das Schreibrecht für |
|
|
wahr, wenn das Recht zum Ausführen von |
|
|
wahr, wenn der Abfrageprozess den selben Eigentümer aufweist |
|
|
wahr, wenn der Gruppeneintrag von Prozess und Datei übereinstimmen |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
|
wahr, wenn |
|
Vergleich von Testausdrücken |
|
|
|
wahr, wenn |
|
|
wahr, wenn |
Fazit
Wer die Möglichkeiten einer Shell wie der Bash voll ausreizt, kommt meist im ersten Anlauf ohne eine weitere Programmiersprache aus. Einfache Abläufe und Abfragen (selbst mit Benutzerinteraktion) sowie komplexe Operationen auf Dateien gelingen ohne zusätzliche Tools. Beim Arbeiten mit den Skripten erleben Sie außerdem die grundlegenden Funktionsprinzipien eines Linux-Systems in Aktion. Das vermittelt wertvolle Aufschlüsse, die Ihnen dann an anderen Stellen weiterhelfen.





