Bash-Skripte taugen nur für einfache Aufgaben, so lautet das landläufige Vorurteil. In der Version 1.x, wie man sie noch auf alten Red-Hat-Systemen findet, eignete sich die Bash tatsächlich nur wenig für komplexe Aufgaben. Wer umfangreichere Arbeiten automatisieren wollte, griff daher zur csh oder tcsh – oder bemühte gleich eine Hochsprache.
Heute installieren alle Distributionen standardmäßig die Version 2.x der Bash, die über sehr viel mehr und komplexere Funktionen verfügt als ihre Vorgänger-Versionen. Weiß der Programmierer die Leistungsfähigkeit der "Bourne Again Shell" richtig einzusetzen, benötigt er kaum noch externe Programme. Das erhöht die Geschwindigkeit: Mit jedem externen Programmaufruf startet eine neue Instanz der Bash, die nur diesen Befehl ausführt und sich anschließend beendet.
Bremsklotz externe Aufrufe
Externe Prozesse werden besonders dann zum Problem, wenn sie nur kurz aufgerufen werden. Folgendes Skript ist als "Fork-Bomb" berüchtigt. Es tut nichts anderes, als sich selbst zwei mal aufzurufen:
#!/bin/bash $0 & $0
Für jeden Aufruf eines externen Programms – "$0" steht hierbei für den Namen des gerade laufenden Skripts – muss der Kernel Speicher reservieren, einen Prozess anlegen, Zeitscheiben umverteilen und vieles mehr. Endet ein Programm wieder, geht es an die Aufräumarbeiten – all das verbraucht nicht unerheblich Systemressourcen. Im Fall der Fork-Bombe benutzt ein böswilliger Anwender diesen Umstand, um das ganze System lahmzulegen, in dem er das einfache Skript unendlich oft aufrufen lässt. Im Ergebnis starten zehntausende Instanzen des Skripts, bis der Speicher voll läuft und keine weiteren Prozesse mehr gestartet werden können. Der Rechner friert nach einigen Sekunden komplett ein, es hilft nur noch ein Hardware-Reset.
Das Listing der Fork-Bombe zeigt den grundlegenden Aufbau eines Bash-Skripts. In der ersten Zeile steht hinter den Zeichen "#!" der Name des Interpreters, der dieses Skript versteht – in unserem Fall /bin/bash. Sie sollten hier nicht, wie häufig zu sehen, einfach /bin/sh eintragen, weil dies je nach System nur ein symbolischer Link ist, der auch auf einen anderen Interpreter zeigen kann.
Einfache Befehlslisten
Der Rest des Programms besteht im einfachsten Fall aus einer Reihe von Befehlen, die nacheinander ausgeführt werden – genau so, wie Sie sie an der Kommandozeile eingeben würden. Dabei wartet die Bash stets, bis ein Kommando komplett ausgeführt wurde, das aufgerufene Programm sich also beendet hat – es sei denn, dem Kommando folgt ein kaufmännisches Und (&). In diesem Fall ruft die Bash das Programm nur auf und macht unmittelbar nach dem Aufruf mit dem nächsten Befehl weiter. Auf diese Weise lassen sich Hintergrundprogramme oder Daemons starten, das aufgerufene Programm läuft also parallel zum Mutterprozess.
Im Beispielprogramm wird "$0" zunächst im Hintergrund aufgerufen und dann noch einmal "$0" im Vordergrund – die Bash wartet also, bis das zweite Programm abgeschlossen ist, bevor sich das Skript selbst beendet.
Bei "$0" handelt es sich um eine Variable, genauer gesagt um eine Spezialvariable: Sie enthält den Namen des aktuell laufenden Skripts. Haben Sie das Beispielprogramm etwa mit "./forkbomb" aufgerufen, setzt die Bash an Stelle von "$0" stets "./forkbomb" ein. "$1" stünde für den ersten Parameter, den Sie beim Aufruf des Skripts angegeben haben, "$2" für den zweiten, und so weiter. Nach oben ist keine Grenze gesetzt.



