Unix-Shell
Das Betriebssystem Unix erlaubt verschiedene Kommandozeileninterpreter, die unter Unix Shells genannt werden. Technisch ist eine solche Shell ein ganz normales Programm ohne besondere Privilegien. Unter Unix kann ein Anwender (oder der Systemverwalter) daher unter verschiedenen Shells wählen. Manche Unix-Versionen stellen dazu ein chsh (Change Shell) Kommando zur Verfügung. Unix-Shells implementieren eine Skriptsprache und können so zur Programmierung und zur Automatisierung von Aufgaben eingesetzt werden.
Nach dem Einloggen ist die Shell das Programm, das vom login-Prozess gestartet wird und Kommandos entgegennimmt. Die Kommandos werden dann ausgeführt. Die Shell enthält eingebaute Kommandos wie 'cd'. Andere Kommandos werden im Dateisystem gesucht und dann gestartet.
Jede Unix-Shell enthält die folgenden Möglichkeiten:
Unix-Shells machen sich die Eigenschaften des zugrundeliegenden Betriebssystems zunutze. Sie implementieren nur das Nötigste. Externe Unix-Kommandos ergänzen über die leistungsfähige Ein-/Ausgabe und Pipeimplementierung alles weitere.
Unix enthält spezielle Kommandos für die Textdateimanipulation, wie Suchen, Editieren, Ersetzen, Worte zählen, Zeichenübersetzung, Abschneiden von Zeilen usw.
Der Urvater der heutigen Shells, die Bourne Shell, enthält nicht einmal eingebaute Kommandos für die Dateieigenschaften und für einfache Berechnungen. Auch die Ausgabe einer Variablen ist nicht möglich. Damit wäre nicht einmal ein einfacher Zähler zu implementieren.
Über die externen Kommandos expr, test und echo wird dies möglich. Ein Skript, das von 1 bis 100 zählt, kann wie folgt realisiert werden:
Der Text eines Skripts kann in eine Datei geschrieben und mit dem Kommando
chmod +x ausführbar gemacht. Es verhält sich dann wie jedes andere Kommando, allerdings ist der Start von privilegierten Skripts oft eingeschränkt.
Beim Hochfahren des Unix-Systems werden auch Shell-Skripte eingesetzt. Die BSD-Varianten starten dazu einfach das Skript /etc/rc, das dann alle Systeminitialisierungen wie Dateisystemüberprüfung, Hintergrundprozesse usw. durchführt. System V Unix-Varianten verwenden sysinit, das aus mehreren Shell-Skripten besteht.
Skripte sind von normalen Programmen in der Anwendung nicht zu unterscheiden. Manche Unix-Versionen liefern sogar einige Kommandos mit, die als Shellskripte realisiert sind. Insbesondere Kommandos wie man (Online-Manual) und cc (Aufruf von C-Compiler, Assembler und Linker) sind bei vielen Unix-Varianten Shell-Skripte.
Der Ahne aller heutigen Shells ist die Bourne Shell (sh) von Stephen Bourne, die 1978 zusammen mit Unix V7 erschien. Diese Shell hat bereits alle wesentlichen Eigenschaften wie Ein-/Ausgabeumlenkung, Pipes, Hintergrundprozesse, Kontrollstrukturen. Bezüglich der Kommandozeileneditierung verlässt sich die Shell auf den Terminaltreiber, der nur das Löschen der ganzen Zeile (CTRL-U) und des letzten Zeichens (DEL) erlaubt.
Die Bourne Shell ist Grundlage der meisten modernen Unix-Shells, die im Wesentlichen eine Erweiterung dieser Shell darstellen. Skripte für die Bourne-Shell sind ohne Änderung auch auf diesen Shells lauffähig.
Die Skriptfähigkeiten der Bourne-Shell sind richtungsweisend.
Bill Joy entwickelte in Berkeley für die zweite BSD-Distribution (2BSD) von 1979 eine Shell, die sich mehr an der C-Syntax orientierte, die C-Shell (csh). Diese Shell erlaubt bereits eine Kommandozeileneditierung, allerdings nicht interaktiv, sondern über eine spezielle Syntax. Sie ermöglicht auch das Wiederholen (und Editieren) alter Kommandos. Außerdem wird erstmals die Job-Control-Möglichkeit implementiert: Über CTRL-Z lässt sich ein Kommando stoppen und später über die internen Kommandos fg (Foreground=Vordergrund) bzw. bg (Background=Hintergrund) fortsetzen.
Die Skriptfähigkeiten der C-Shell sind durch kleine Unzulänglichkeiten etwas eingeschränkt, z. B. kann die Fehlerausgabe nicht unabhängig von der Standardausgabe umgelenkt werden. Ein Anwender, der für die interaktive Eingabe die C-Shell verwendet, kann durch ein vorangestelltes #!/bin/sh in seinen Skripten das Betriebssystem veranlassen, die Standard-Shell (diese ist mindestens kompatibel zur Bourne Shell, auf modernen Systemen auch meist POSIX-konform) zu verwenden. Dies ist auch für alle anderen Shells möglich.
Auf jedem Unix-System befindet sich eine zu der Bourne Shell kompatible Shell in /bin/sh. Die Verfügbarkeit weiterer Shells hängt von der jeweiligen Unix-Variante ab, eine C-Shell Version findet sich oft in /bin/csh. Wegen der unterschiedlichen Syntax unterscheidet man Bourne Shell und C-Shell Abkömmlinge. Da praktisch alle moderenen Shells in der Programmiersprache C geschrieben sind, lassen sich fehlende Shells leicht nachrüsten. Auch auf fremden Betriebssystemen kann man oft eine Unix-Shell, zumindest als Fremdsoftware, finden.
David Korn entwickelte für Unix System V von AT&T; die Korn Shell (ksh). Diese orientiert sich an der Bourne Shell, übernimmt aber auch die Neuerungen der C-Shell wie Job-Control, eine weiter verbesserte Kommandozeileneditierung. Diese Shell (ksh88) ist Grundlage des POSIX-Standards. Die Korn-Shell war als Teil von Unix-System V lange Zeit nur kommerziell erhältlich. Seit dem 1. März 2000 ist der Quelltext von ksh93 frei verfügbar. Es existiert eine Version von 1988 (ksh88) und eine neuere von 1993 (ksh93). Viele kommerzielle Unix-Systeme verwenden die ksh als Standard-Shell (/bin/sh).
Die dtksh (Desktop Korn Shell) stellt eine Korn Shell mit zusätzlichen Kommandos für die Programmierung von Benutzeroberflächen unter X11/Motif dar.
Die Public Domain Korn Shell (pdksh) ist eine freie und nicht vollständig kompatible Kopie der AT&T Korn Shell. Viele Funktionen von ksh88 und wenige von ksh93 sind in ihr enthalten. Das OpenBSD-Projekt verwendet die pdksh als Standard-Shell (/bin/sh).
Die Shell des GNU-Projekts heißt Bourne Again Shell (bash), ebenfalls eine Bourne Shell mit vielen Erweiterungen. Die Bourne Again Shell ist POSIX-konform und enthält viele Funktionen der Korn Shell und der C-Shell. Sie ist die Standard-Shell (/bin/sh) auf vielen Linux-Systemen.
Die TENEX-C-Shell (tcsh) stellt eine Erweiterung der C-Shell von Christos Zoulas dar. Sie enthält Verbesserungen der Kommandozeileneditierung und andere Erweiterungen, ist aber sonst vollständig kompatibel zu der C-Shell.
Die Z-Shell (zsh) ist eine moderne Shell mit sehr vielen Möglichkeiten. Sie ähnelt sehr der Korn Shell und übernimmt auch Funktionen der Bourne Again Shell und der TENEX-C-Shell. Sie geht aber in vieler Hinsicht eigene Wege und gilt als eine der leistungsfähigsten Unix-Shells.
Die Almquist Shell (ash) von Kenneth Almquist ist eine kleine und schnelle Neuimplementierung der Bourne Shell. Sie orientiert sich am POSIX-Standard und eignet sich sehr gut zur Ausführung von Skripten. Zudem verzichtet sie auf viele Fähigkeiten wie Job Control, die für interaktive Benutzung hilfreich sind. Das FreeBSD- und NetBSD-Projekt verwenden eine weiterentwickelte Versionen der ash als Standard-Shell (/bin/sh).Allgemeines
Moderne Shells können darüber hinaus
Hinsichtlich dem Abbruch eines Kommandos machen sich die Shells die Eigenschaften des zugrundeliegenden Terminal-Gerätetreibers zunutze. Die Shell wartet normalerweise auf das Ende eines Kommandos. CTRL-C bewirkt unter Unix einen Kommandoabbruch, den der Gerätetreiber auslöst.Unix-Werkzeuge
Skripte
#!/bin/sh
I=1 # Variable I auf 1 setzen
while test $I -le 100 # While-Schleife, externes Kommando test I<100
do
echo $I # externes Kommando echo, gibt I aus
I=`expr $I + 1` # externes Kommando expr, Ausgabe von expr nach I
done
Bei moderneren Shells sind die Kommandos expr, test und echo intern, da sie sehr häufig benötigt werden und die Shell auch nicht wie bei sehr frühen Systemen klein gehalten werden muss.Systemstart
Kommandos, die eigentlich Shellskripte sind
Die frühen Shells
Die Bourne Shell - sh
Die C-Shell - csh
Weiterentwicklungen
Die Korn Shell - ksh
Die Public Domain Korn Shell - pdksh
Die Bourne Again Shell - bash
Die TENEX-C-Shell - tcsh
Die Z-Shell - zsh
Die Almquist Shell - ash