Script-Programmierung

Die Shell


Das Linux-System besteht genau genommen aus dem Kernel und einer Reihe von Programmen (GNU-Tools, GNU is not Linux!) die hauptsächlich in C geschrieben wurden. Diese Programme sind im allgemeinen über Konfigurationsdateien und/oder Parameter steuerbar. Die Konfigurationsdateien sind fast ausschließlich reine Textdateien und können prinzipiell mit einem Texteditor verändert werden. Um diese Komponenten zu einem ganzen System zusammenzufügen, kommen shell-Scripte zum Einsatz. Die Shell ist ein Kommandointerpreter, der Kommandos (ausführbare Programme und Scripte) startet und eine entsprechende Arbeitsumgebung (Environment) für das Kommando erzeugt. Die Shell ist jedoch wesentlich mehr. Sie bietet komfortable Möglichkeiten zur Parameterübergabe, zur Datenstromumleitung, Parametersubstitution etc. Möglich ist das durch die Implementierung einer kompletten Programmiersprache mit Anweisungen zur Eingabe, Ausgabe, Entscheidungen, Schleifen, Variablen und Arrayverwaltung, Berechnungen, Stringverarbeitung usw, usf.
Um Shellscripte zu verstehen ist es wichtig, die Arbeitsweise der Shell zu kennen. Hier soll das am Beispiel der bash gezeigt werden.
Nehmen wir an wir befinden uns in einer interaktiven Shell und senden über unser Terminal eine Kommandozeile ab. Das passiert im Normalfall mit einem abschliessenden <Enter>. Die Shell liest die Kommandozeile ein und bearbeitet sie Schritt für Schritt. Dabei werden nacheinander verschiedene Aktionen ausgeführt, in denen die bash nach verschiedenen ungequoteten Sonderzeichen sucht, die Spezialfunktionen aktivieren. Nacheinander passiert folgendes:

  1. Separation der Eingabe
    Zuerst wird die Eingabezeile anhand der Trennzeichen separiert. In der bash führen alle ungequoteten meta-Zeichen zur Separation in einzelne Worte. Die meta-Zeichen sind im Normalfall die blank-Zeichen <space> (Leerzeichen), <tab> (Tabulator) sowie ¦ & ; ( ) < >. Genauere Informationen, siehe Quoting und Sonderzeichen. Dazu sucht die bash nach ungequoteten Trennzeichen in der Eingabezeile und spaltet sie in Worte auf. Folgen mehrere blanks (<space> <tab>) aufeinander, so wirken sie als ein einzelnes Trennzeichen. Es ist also unwesentlich, ob die einzelnen Worte in der Kommandozeile durch ein oder mehrere Leerzeichen und/oder Tabulatoren voneinander getrennt werden. Eine mehrfache Angabe der anderen meta-Zeichen ¦ & ; ( ) < > hat wiederum spezielle Bedeutungen für die bash.
    Ungequotete meta-Zeichen führen also unweigerlich zu einer Aufspaltung in einzelne Worte, sie dürfen in Parametern also nicht ungeschützt vorkommen und sind auf jeden Fall zu quoten!
  2. Suche nach Kontrolloperatoren
    In einer Kommandozeile können auch mehrere Befehle angegeben werden, die von der Shell ausgeführt werden sollen. Damit die Shell erkennt, dass es sich um weitere Kommandos und nicht einfach nur Parameter handelt, werden diese durch spezielle Kontrolloperatoren getrennt. Diese sind in der bash ¦ ¦¦ & && ; ;; ( ) . Mit diesen Operatoren können mehrere Kommandos so gruppiert werden, dass Datenweiterleitungen zwischen den Prozessen und logische Abhängigkeiten definiert werden. Eine solche Gruppe von Kommandos wird von links nach rechts abgearbeitet.
    Ungequotete Kontrolloperatoren führen also unweigerlich zu einer Aufspaltung in einzelne Kommandos, sie dürfen in Parametern also nicht ungeschützt vorkommen und sind auf jeden Fall zu quoten!
  3. Einrichtung der Datenkanäle
    Die bash sucht nun nach Festlegungen zur Datenstromumleitung für das Kommando. Die Notation einer Datenstromumleitung wird durch die meta-Zeichen < > & sowie der Kanalnummer vorgenommen. Sollten keine entsprechenden Festlegungen gefunden werden, so richtet die bash defaultmässig stdin (Kanal 0), stdout (Kanal 1) und stderr (Kanal 2) ein.
  4. Ausführung der Expansionen
    Die Expansionen werden durch spezielle Expansionszeichen { } ˜ $ ` * ? [ ] eingeleitet.
    Ungequotete Expansionszeichen veranlassen also Expansionen der bash. Wenn diese Zeichen in Parametern enthalten sind und eine Expansion nicht gewünscht wird, so sind sie zu quoten!
  5. Kommandoausführung