Unix-Shell

textuelle Benutzerschnittstelle unter Unix/unixoiden Betriebssystemen
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 24. September 2003 um 12:19 Uhr durch Hubi (Diskussion | Beiträge) (neu). Sie kann sich erheblich von der aktuellen Version unterscheiden.
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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.

Allgemeines

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:

  • Starten von Kommandos
  • Dateinamen-Wildcards (globs) als Kommandoargumente
  • Ausführung von Kommandos in Dateien, sogenannte Skripte.
  • Bedingungen (if, case) und Schleifen (while, for)
  • Eingebaute Kommandos (cd, read)
  • interne Variablen
  • Manipulation der Umgebungsvariablen der gestarteten Prozesse
  • Ein-/Ausgabeumlenkung
  • Starten mehrerer Prozesse, Verkettung über Pipes
  • Starten von Prozessen im Hintergrund
  • Definition des Eingabe-Aufforderungsstrings (Prompt)
  • Definition der Suchreihenfolge externer Kommandos

Moderne Shells können darüber hinaus

  • Editierung der Kommandozeile (command line editing)
  • Wiederholung und Editieren früherer Kommandos ('command history)
  • Stoppen und erneutes Starten von Prozessen (Job Control)
  • Verschieben von Prozessen aus Vorder- in den Hintergrund und umgekehrt (Job Control)
  • Eingebautes Kommando zur Durchführung von Berechnungen (expr)
  • Eingebautes Kommando zum Testen von Dateieigenschaften (test)

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

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.

Skripte

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:

#!/bin/sh                
I=1                      # Variable I auf 1 setzen
while test $I -le 100    # While-Shleife externes Kommando test
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, das sie sehr häufig benötigt werden und die Shell auch nicht wie bei sehr frühen Systemen klein gehalten werden muss.

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.

Systemstart

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. anwirft. System V Unix-Varianten sysinit, das aus mehreren Shell-Skripten meist besteht.

Kommandos, die eigentlich Shellskripte sind

Skripte sind von normalen Programmen in der Anwendung nicht zu unterscheiden. Manche Unix-Versionen liefern sogar einige Kommandos mit, die eigentlich Shellskripte sind. Insbesondere Kommandos wie man (Online-Manual) und cc sind bei vielen Unix-Varianten Shell-Skripte.

Die Bourne Shell sh

Der Urvater aller 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äßt sich die Shell auf den Terminaltreiber, der nur das Löschen der ganzen Zeile (CTRL-U) und des letzen 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.

Steven Bourne: An Introduction to the Unix-Shell (1978)

Die C-Shell csh

Bill Joy entwickelte in Berkeley für die BSD-Distributionen eine Shell, die sich mehr an der C-Syntax orientierte, die C-Shell csh. Diese Shell erlaubt bereits eine Kommandozeileneditierung, allerdings über eine spezielle Syntax. Sie bietet auch das Wiederholen (und Editieren) alter Kommandos. Ausserdem 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 Unzunlä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 Bourne Shell. Dies ist auch für alle anderen Shells möglich.

Bill Joy: An Introduction to the C-Shell Tom Christiansen: Csh Programming Considered Harmful

Die Korn Shell ksh

David Korn entwickelte für Unix System-V von AT&T die Korn Shell ksh. Diese orentiert sich an der Bourne Shell, übernimmt aber auch die Neuerungen der C-Shell wie Job-Control, eine weiter verbesserte Kommandozeileneditierung. Diese Shell ist Grundlage des POSIX-Standards. Die Korn-Shell war als Teil von Unix-System V lange Zeit nur kommerziell erhältlich. Heute ist sie jedoch auch frei verfügbar. Es existiert eine Version von 1988 und eine neuere von 1993 (ksh93).

Eine einfache Variante der Korn-Shell ist die pdksh (Public Domain Korn Shell), die aber nicht alle Möglichkeiten der ksh bietet. Da die ksh jetzt ebenfalls frei verfügbar ist, hat diese Shell nur noch eine geringe Bedeutung.

Die dtksh (Desktop Korn Shell) stellt eine Korn Shell mit zusätzlichen Kommandos für die Programmierung von Benutzeroberflächen unter X11/Motif dar.

www.kornshell.com

Die Bourne Again Shell bash

Die Shell des GNU-Projekts heisst Bourne Again Shell (bash), ebenfalls eine Bourne Shell mit vielen Erweiterungen. Die Bourne Again Shell orientiert sich am POSIX-Standart und enthält daher viele Möglichkeiten der Korn Shell. Sie ist auch die Standard-Shell auf vielen Linux-Systemen.

Die tcsh

Die T-Cshell tcsh stellt eine Erweiterung der C-Shell von Christos Zoulas dar. Sie enthält unter anderem Verbesserungen der Kommandozeileneditierung und andere Erweiterungen, ist aber sonst vollständig kompatibel zu der C-Shell.

  • www.tcsh.org
  • Paul Dubois: Using tcsh and csh, O-Reilly. 1995, ISBN

Die Z-Shell zsh

Die Z-Shell zshist eine moderne Shell mit sehr vielen Möglichkeiten. Sie orientiert sich ebenfalls an der Bourne Shell und übernimmt vieles von der Korn Shell. Sie geht aber in vieler Hinsicht eigene Wege und gilt als eine der leistungsfähigsten Unix-Shells.

Allgemeine Literatur

  • Helmut Herold: Linux-Unix-Shells, Bourne-Shell, Korn-Shell, C-Shell, bash, tcsh ISBN 3827315115