Wie sind Shell-Programme entstanden ?
Computer-Urzeit: In der Zeit der ersten primitiven Betriebssysteme
war es selbstverständlich, das System und seine Funktionen manuell
zu steuern, und zwar hauptsächlich durch Eingabe von Text-Befehlen
über die "Konsole"
Die ersten Programme konnten nicht wie heute gewohnt mit Menschen "kommunizieren"
- man startete sie durch manuelle Eingabe von Befehls-Texten, sie liefen
dann ab (oder auch nicht) und lieferten das Ergebnis als Datei (z.B. Liste,
Lochkarten, Lochstreifen...)
Es war mühsam, eine ganze Reihe von Aufgaben einzeln zu starten.
Daher wurden verschiedene "batch"-Techniken entwickelt, die
es erlaubten, die Bearbeitung einer Kette von Programmen zu "programmieren".
Automatisierung: Die erfolgreichste shell-Technik beruht darauf,
Text-Befehle an das Betriebssystem nicht einzeln einzugeben, sondern von
einer Text-Datei zu lesen. Eine derartige batch-Datei ("Stapelverarbeitung")
enthielt zunächst nur eine Liste genau derselben Befehle, wie man
sie manuell eingeben würde. An Stelle der vielen einzelnen Befehle
erteilte man nur mehr einen Befehl, nämlich die betreffende batch-Datei
zu verarbeiten.
Später wurde die batch-Technik zu einer Art richtiger Programmierung
erweitert: Möglichkeiten zur Abfrage von Bedingungen, Verzweigung,
Schleifen, Fehlerbehandlung, Variable, usw. wurden eingeführt. In
dieser Form wird die Programmierung von Systemfunktionen noch heute angewendet,
vorwiegend von AdministratorInnen, ProgrammiererInnen, und beim Betrieb
von Servern. Mehrere Namen dafür sind in Gebrauch, hier wird "Shell-Programmierung"
verwendet.
Fast alle gängigen Betriebssysteme bieten an, sie über die jeweilige
"Konsole" mit Text-Befehlen zu steuern. Moderne Systeme stützen
sich wieder in verstärktem Ausmass auf diese Technik, denn sie bietet
viele Vorteile:
+ Kompatibilität: Texte werden von allen Betriebssystemen verstanden
und nicht an Hersteller gebunden.
+ Flexibilität: Über Texte lassen sich alle Daten problemlos
mitteilen, auch zukünftige Anforderungen lassen sich absehbar bewältigen.
+ Freier Zugang: Die Verwendung von Texten ist absolut offen, d.h. von
allen AnwenderInnen mit zahlreichen einfachen Programmen (Editoren) ausführbar.
Programme:
Bei der Entwicklung von Programmen war es früher selbstverständlich,
die Steuerung durch shell-Programme vorzusehen. Man startet derartige
Programme auf der "Konsole" des Betriebssystems durch Angabe
des Programm-Namens, gefolgt von "Parametern", die angeben,
was das aufgerufene Programm zu tun hat. Das ist aktueller Stand
der Technik bei allen selbständig ablaufenden "Diensten"
(services, daemons). - Das sind Programme ohne user-interface (kein Fenster,
etc.), die ihre Arbeit im Hintergrund erledigen. Darunter fallen z.B.
fast alle Server-Programme.
Fenster und Maus-Programme: Heutige Anwendungs-Programme lassen
sich nur mehr teilweise shell-steuern, denn sie können ohne user-Interaktion
kaum mehr laufen.
In manchen Fällen ist es trotzdem möglich, dann kann man diese
Programme als "programmierbares Werkzeug" einsetzen. Ein gutes
Programm zur Bildverarbeitung lässt sich z.B. so programmieren, dass
bestimmte grafische Operationen (Kontrast einstellen, Format ändern,...)
auf eine ganze Reihe von Bild-Dateien (z.B. innerhalb eines Ordners) angewendet
wird - das erfolgt sinnvollerweise vor-programmiert, ohne AnwenderInnen-Aufsicht.
Programm-Kommunikation: Unter dieses Thema fallen auch alle
Versuche, eine Kommunikation verschiedener Programme mit den Mitteln des
Betriebssystems zu ermöglichen. Man geht hier zwei unterschiedliche
Wege:
(1) Das Betriebssystem bietet standardisierte Möglichkeiten, Objekte
und Informationen darüber auszutauschen, bzw. Nachrichten an andere
Programme zu senden. Diese Methoden sind elegant, jedoch vom jeweiligen
Betriebssystem (Hersteller) abhängig, der Veränderung (Versionen)
unterworfen, und meist nur von Profis bzw. mit speziellen Programmen anwendbar.
Windows und MacOS bieten z.B. diese Möglichkeit.
(2) Man benutzt einfache Text-Dateien zur Verständigung.
Linux stützt sich vorwiegend auf diese Technik. Das System selbst
und fast alle seine Programme werden durch Text-Dateien gesteuert. BenutzerInnen
haben mit jedem beliebigen Text-Programm (Editor) einfachen Zugang zu
diesen Daten.
Mittlerweile gibt es zahlreiche moderne Programme (Fenster, Maus...),
die beim Erstellen, Lesen und Ändern dieser Text-Dateien behilflich
sind.
Auch Windows nutzt diese Technik teilweise.
Windows:
Die Oberfläche des Vorgängers DOS bestand ausschliesslich aus
einer einzigen "Konsole", und war dementsprechend mit Text-Befehlen
bedienbar.
Zur batch-Programmierung verwendete man *.bat-Dateien.
Neuere Win-Versionen bieten das Konsolen-Fenster ebenfalls an. Die Konsole
läuft auf einem "virtuellen DOS-PC", mehrere Instanzen
(unabhängige Fenster) können gestartet werden. Diese Emulation
(PC-Simulation) bietet Zugriff auf alle Dateien und viele Resourcen des
Win-Systems.
Der neue commandline-processor (Programm zur Verarbeitung von manueller
Konsolen-Eingabe und batch-Programmen) verwendet sowohl *.bat
als auch *.cmd-Dateien
Linux:
Stützt sich grundlegend auf die Verarbeitung von Text-Befehlen. Mehrere
AnwenderInnen (echtes MultiUser System) können eine beliebige Anzahl
unabhängiger Konsolen ("shell"s) betreiben.
Die hochentwickelte und ausgefeilte shell-Technik ist nach Linux-Art frei
zugänglich (OpenSource), man kann unter mehreren Programmen (shells)
wählen.
Sowohl das Betriebssystem selbst als auch alle Dienste (daemons) und die
meisten Programme lassen sich mit shell-Methoden steuern und benutzen
diese auch selbst zur gegenseitigen Steuerung.
Linux erkennt shell-script-Dateien an den führenden Zeichen #!
Meist fügt man noch einen Hinweis auf das shell-Programm an (s.u.).
Beispiel:
Hier wird gezeigt, wie man eine kurze Befehlskette manuell an der Konsole
eingibt (gelb) oder als shell-script-datei (blau) ausführt.
Der einfache Auftrag: Datensicherung aller Dateien von einem Verzeichnis
(Ordner, directory):
+ Erzeuge eine Liste aller Dateien und lege sie in einer Text-Datei
ab.
+ Kopiere alle Dateien an einen Sicherungs-Platz
Hier wird angenommen, dass die beiden Verzeichnisse "Quelle"
und "Ziel" bereits existieren, und dass sich in "Quelle"
einige Dateien befinden. Diese Voraussetzungen müssen sie herstellen,
wenn sie die Beispiele real testen wollen.
Windows-Beispiel:
Manuelle Eingabe der einzelnen Befehle:
C:\> dir C:\Quelle\*.* >F:\Ziel\liste.txt C:\> copy C:\Quelle\*.* F:\Ziel\*.*
Inhalt der batch-Datei C:\testjob.bat:
dir C:\Quelle\*.* >F:\Ziel\liste.txt
copy C:\Quelle\*.* F:\Ziel\*.*
Manuelle Eingabe des batch-Befehls: C:\> testjob oder C:\>
C:\testjob.bat
Der Inhalt der Dateiliste wird so angezeigt: C:\> type F:\Ziel\liste.txt
Linux-Beispiel:
Manuelle Eingabe der einzelnen Befehle:
ich@tux:> ls
/home/ich/quelle/ > /home/ich/ziel/liste.txt ich@tux:> cp /home/ich/quelle/* /home/ich/ziel/*
Inhalt der batch-Datei /home/ich/testjob:
#!/bin/sh
ls /home/ich/quelle/ > /home/ich/ziel/liste.txt
cp /home/ich/quelle/* /home/ich/ziel/*
Manuelle Eingabe des batch-Befehls: ich@tux:> sh
testjob oder ich@tux:>
sh /home/ich/testjob
Der Inhalt der Dateiliste wird so angezeigt: ich@tux:> cat /home/topadmin/ziel/dateiliste.txt
Prompt: In blauer Schrift der "Prompt"
des Systems. So gibt ihnen das System bekannt, dass die Konsole auf Eingabe
"wartet". DOS zeigt normalerweise Volume (z.B. Festplatte, hier
C) und aktuelles Verzeichnis an. Linux zeigt den PC (hier: tux), @ und
den eigenen Namen (hier: ich), ihren persönliches Arbeits-Verzeichnis,
bezeichnet durch home und ihren Namen. Beide
Prompts sind einstellbar.
Befehle und Parameter: Als Syntax ("Grammatik") für
Konsolen-Befehle hat sich folgende Regel durchgesetzt:
Zuerst der Name des Befehls (bzw.Programms), dann die Liste der Parameter,
getrennt durch Leerzeichen. Der Zeilen-Abschluss am Ende leitet den Befehl
an das Betriebssystem weiter, genauer an ein Programm, das meist "command
line interpreter" o.ä. genannt wird.
Parameter sind genauere Angaben zu einem Befehl. Anzahl und Möglichkeiten
sind unterschiedlich.
Dateiliste anlegen: Die Liste erhält man in DOS mit dir,
in Linux mit ls. Die Ausgabe wird in beiden Fällen
nicht angezeigt, sondern mit > an die angegebene
Datei liste.txt weitergeleitet. Linux benötigt
keine Datei-Erweiterung (txt). - Es ist jedoch
praktisch, da sich dann die Text-Datei sowohl in Linux als auch in DOS,
Win und MacOS verwenden lässt. Batch-Befehl: Kann in beiden Fällen nur dann "direkt"
(mit dem Dateinamen) eingegeben werden, wenn sich die batch-Datei im Suchpfad
(path) des Systems befindet. Im Zweifel den vollen
Dateinamen der batch-Datei angeben: in DOS volume\Pfad\Dateiname.
In Linux gibt man das auszuführende Programm an (sh
für shell), dazu den Dateinamen, im Zweifel inklusive Pfad.
Textdatei (Dateiliste) auf der Konsole ausgeben: In DOS mit type,
in Linux mit cat. Verwechseln sie das nicht mit
demjenigen Befehl, der zur Erzeugung der Dateiliste verwendet wurde -
naturgemäss sieht die Ausgabe auf der Konsole genau (!) gleich aus.
Der Unterschied wird klar, wenn sie die im Ordner "Quelle" enthaltenen
Dateien entfernen: Die Befehle dir bzw. ls
zeigen dann das leere Verzeichnis, die Dateiliste bleibt unverändert.
Wie jede andere Text-Datei können sie die Dateiliste mit jedem Text-Editor-Programm
öffnen und nach Belieben ändern.
Anmerkung: Falls ihr Bildschirmfenster nicht breit genug ist, werden
die Zeilen der Beispiele "umgebrochen", d.h. auf mehrere Zeilen
verteilt. Sie dürfen diese Zeilen jedoch bei der Eingabe an eine
Konsole nicht unterbrechen - Das System versteht sonst jede Zeile als
eigenen Befehl !