Home / LinuxUser / 2005 / 02 / Einführung in die Bash-Programmierung

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(161 Punkte bei 4 Stimmen)
Mandriva in Nöten
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Fertighaus im Eigenbau

Einführung in die Bash-Programmierung

01.02.2005 Skripte sollen meist wiederkehrende oder lästige Arbeiten automatisieren. Die Standard-Shell Bash stellt Ihnen dazu eine ganze Reige von Funktionen bereit. Dieser Artikel erklärt, wie Sie ihre eigenen Shell-Skripte schreiben.

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.

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

930 Hits
Wertung: 139 Punkte (3 Stimmen)

Schlecht Gut

Infos zum Autor

Mirko Dölle

Redakteur für Linux bei c't, Heise Zeitschriften Verlag; ehemals Competence Center Hardware/Linux-Magazin, Linux New Media AG


Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...