SH(1) MUTOS SH(1) NAME sh, for, case, if, wihle, :, . break, continue, cd, eval, exec, exit, export, login, newgrp, read, readonly, set, shift, times, trap, umask, wait - Kommandointerpreter und Kommandosprache Shell ÜBERSICHT sh [ -ceiknrstuvx ] [ arg ] ... BESCHREIBUNG Shell ist eine Kommando-Programmiersprache, mit deren Hilfe Kommandos zur Ausführung gebracht werden können, die an einem Terminal eingegeben oder in einem File abgespeichert worden sind. Die Bedeutung der Argumente, die an Shell übergeben werden können, wird unter der Überschrift Aufruf erläutert. Kommandos Ein _e_i_n_f_a_c_h_e_s _K_o_m_m_a_n_d_o ist eine Folge von _W_o_r_t_e_n, die durch Leerzeichen oder Tabulatoren getrennt sind. Das erste dieser Worte legt den Namen des Kommandos, d.h. den Namen des Files fest, welches ausgeführt werden soll. Die verbleibenden Worte werden als Argumente an das aufgerufene Kommando (Programm) übergeben. Der Kommandoname selbst wird als Argument 0 über- geben (siehe exec(2)). Der _W_e_r_t eines einfachen Kommandos ist sein Rück- kehrstatus, falls die Kommandoabarbeitung normal beendet wurde, bzw. 200+_S_t_a_t_u_s bei nichtnormaler Beendigung (siehe signal(2) für eine Liste der Statuswerte). Eine _P_i_p_e_l_i_n_e ist eine Folge von einem oder mehreren _K_o_m_m_a_n_d_o_s, die durch | getrennt sind. Standardausgabe jedes der Kommandos (außer des letzten) wird durch pipe(2) mit der Standardeingabe des nächstfolgenden Kommandos verbun- den. Jedes der Kommandos wird in einem separaten Prozeß abgearbeitet. Shell wartet auf die Beendigung des letzten Kommandos, bevor es seine Arbeit fortsetzt. Eine _L_i_s_t_e ist eine Folge aus einer oder mehreren _P_i_p_e_l_i_n_e_s, die durch ;, &, && oder || getrennt sind und mit ; oder & abgeschlossen werden können. Dabei haben ; und & die gleiche Priorität, welche niedriger ist als die Priorität von && und ||, die ebenfalls gleiche Priorität haben. Ein Semi- kolon bewirkt die sequentielle Ausführung der so getrennten _P_i_p_e_l_i_n_e_s. Wird eine _P_i_p_e_l_i_n_e mit Ampersand abgeschlossen, so wartet Shell nicht auf die Beendigung der Ausführung dieser _P_i_p_e_l_i_n_e, bevor es seine Arbeit fort- setzt. Die _P_i_p_e_l_i_n_e wird im "Hintergrund" abgearbeitet. Das Symbol && (||) bewirkt, daß die ihm folgende _L_i_s_t_e nur abgearbeitet wird, falls die vorangegangene _P_i_p_e_l_i_n_e einen Rückkehrwert gleich Null (ungleich Null) lie- ferte. Ein Kommando kann in einer _L_i_s_t_e statt mit einem Semikolon auch durch ein Newline-Zeichen (im folgenden auch kurz "Newline" genannt), d.h. den Beginn einer neuen Zeile, begrenzt werden. Ein _K_o_m_m_a_n_d_o ist entweder ein _e_i_n_f_a_c_h_e_s _K_o_m_m_a_n_d_o oder einer der folgenden Konstruktionen. Der Rückkehrwert eines Kommandos ist der des letzten ein- fachen Kommandos, das innerhalb des Kommandos ausgeführt wurde. fffooorrr _N_a_m_e [iiinnn _W_o_r_t ...] dddooo _L_i_s_t_e dddooonnneee _N_a_m_e wird nacheinander jedem der nach in angegebenen _W_o_r_t_e gleichge- setzt. Für jede der Belegungen von _N_a_m_e wird einmal die _L_i_s_t_e abge- arbeitet. Die Ausführung dieses Konstruktes ist beendet, wenn kein einzusetzendes _W_o_r_t mehr vorhanden ist. Ist der Teil in _W_o_r_t ... nicht angegeben, so wird statt dessen in "$@" angenommen. - 1 - SH(1) MUTOS SH(1) cccaaassseee _W_o_r_t iiinnn [_M_u_s_t_e_r [ ||| _M_u_s_t_e_r ] ... ))) _L_i_s_t_e ;;;;;; ] ... eeesssaaaccc Durch dieses Kommando wird diejenige _L_i_s_t_e abgearbeitet, die dem ersten _M_u_s_t_e_r zugeordnet ist, das mit _W_o_r_t übereinstimmt. Die Form der Muster ist die gleiche, wie für die File-Namen-Generierung. iiifff _L_i_s_t_e ttthhheeennn _L_i_s_t_e [eeellliiifff _L_i_s_t_e ttthhheeennn _L_i_s_t_e] ... [eeelllssseee _L_i_s_t_e] fffiii Die _L_i_s_t_e nach if wird abgearbeitet. Falls sie den Rückkehrwert Null liefert, wird die _L_i_s_t_e nach then abgearbeitet. Andernfalls wird die _L_i_s_t_e nach elif abgearbeitet, und falls diese einen Rückkehrwert gleich Null hat, so erfolgt die Abarbeitung der zugehörigen _L_i_s_t_e nach then. Bei einem Rückkehrwert ungleich Null wird die _L_i_s_t_e nach else abgearbeitet. wwwhhhiiillleee _L_i_s_t_e [dddooo _L_i_s_t_e] dddooonnneee Wenn die Abarbeitung der _L_i_s_t_e nach while einen Rückkehrwert gleich Null liefert, so wird die _L_i_s_t_e nach do abgearbeitet. Diese Schleife wird solange fortgesetzt, bis die Abarbeitung der while-_L_i_s_t_e einen Rückkehrwert ungleich Null liefert. Der Rückkehrwert eines while- Kommandos ist der des zuletzt ausgeführten Kommandos der do-_L_i_s_t_e. Anstelle von while kann until geschrieben werden, falls ein negierter Test zur Begrenzung der Schleife gewünscht wird. ((( _L_i_s_t_e ))) Die _L_i_s_t_e wird in einem eigenen Unter-Shell-Prozeß ausgeführt. {{{ _L_i_s_t_e }}} Die _L_i_s_t_e wird einfach ausgeführt. Die folgenden Worte werden durch Shell nur dann erkannt, wenn sie als erstes Wort in einem Kommando auftreten und nicht apostrophiert sind. if then else elif fi case esac for while until do done { Kommandosubstitution Die Standardausgabe eines Kommandos, die in Akzentzeichen eingeschlossen ist (`...`), kann als Wort oder als Teil eines Wortes benutzt werden. Die Ausgabe eines abschließenden Newline-Zeichens wird unterdrückt. Parametersubstitution Durch Voranstellen eines "$" vor den Namen eines Parameters wird an dieser Stelle der Wert des Parameters in das Kommando eingesetzt. Den Stellungs- parametern können mit set Werte zugewiesen werden. Variablen können Werte auf folgende Arten zugewiesen bekommen: _N_a_m_e===_W_e_r_t [ _N_a_m_e===_W_e_r_t ] ... ${{{_P_a_r_a_m_e_t_e_r}}} Ein _P_a_r_a_m_e_t_e_r ist eine Folge aus Buchstaben, Ziffern und Unterstrichen (ein _N_a_m_e ), eine Ziffer oder eines der Zeichen * @ # ? - $ !. Falls der Parameter einen Wert besitzt, so wird dieser substituiert. Die Klammern sind nur notwendig, wenn sich an den _P_a_r_a_m_e_t_e_r unmittelbar ein Buchstabe, eine Ziffer oder ein Unterstrich anschließen, die nicht als Teil des Parameternamens interpretiert werden sollen. Wenn _P_a_r_a_- _m_e_t_e_r eine Ziffer ist, dann handelt es sich um einen der Stellungs- parameter. Wenn für _P_a_r_a_m_e_t_e_r * oder @ angegeben ist, so werden dafür - 2 - SH(1) MUTOS SH(1) alle Stellungsparameter, begonnen mit $1, substituiert, wobei zur Trennung zwischen den einzelnen Parametern Leerzeichen eingefügt wer- den. $0 wird gleich dem nullten Argument beim Aufruf von Shell gesetzt. ${{{_P_a_r_a_m_e_t_e_r-_W_o_r_t}}} Falls _P_a_r_a_m_e_t_e_r einen Wert hat, so wird dieser substituiert. Andern- falls wird _W_o_r_t substituiert. ${{{_P_a_r_a_m_e_t_e_r=_W_o_r_t}}} Falls _P_a_r_a_m_e_t_e_r noch kein Wert zugewiesen wurde, so wird ihm _W_o_r_t als Wert zugewiesen. Danach wird der Wert des Parameters substituiert. Stellungsparameter können auf diese Weise nicht mit Werten belegt wer- den. ${{{_P_a_r_a_m_e_t_e_r?_W_o_r_t}}} Falls _P_a_r_a_m_e_t_e_r einen Wert hat, so wird dieser substituiert. Andern- falls wird _W_o_r_t ausgegeben und der Shell-Prozeß beendet. Falls _W_o_r_t nicht angegeben ist, wird statt dessen eine Standardmeldung ausge- geben. ${{{_P_a_r_a_m_e_t_e_r+_W_o_r_t}}} Falls _P_a_r_a_m_e_t_e_r einen Wert hat, so wird _W_o_r_t substituiert. Andernfalls wird nichts substituiert. In allen angeführten Fällen wird _W_o_r_t nur dann berechnet, wenn es als ein- zusetzende Zeichenkette gebraucht wird. (Das bedeutet, zum Beispiel, daß in "echo ${d-`pwd`}" nur dann pwd ausgeführt wird, wenn die Variable _d kei- nen Wert besitzt). Die folgenden _P_a_r_a_m_e_t_e_r werden automatisch durch Shell gesetzt. # Die Anzahl der Stellungsparameter (dezimal). - Die Optionen, die bei Aufruf von Shell oder durch set eingestellt werden. ? Der Rückkehrwert des zuletzt ausgeführten Kommandos. $ Die Prozeßnummer des laufenden Shell-Prozesses. ! Die Prozeßnummer des zuletzt gestarteten Hintergrund-Kommandos. Die folgenden _P_a_r_a_m_e_t_e_r werden von Shell benutzt, jedoch nicht gesetzt. HOME Das Standard-Argument (Home-Directory) des Kommandos cd. PATH Der Suchpfad für Kommandos (siehe Ausführung). MAIL Falls diese Variable als Wert den Namen eines Files hat, so wird der Nutzer informiert, wenn eine Nachricht in diesem File abgelegt wurde. PS1 Die primäre Eingabeanforderung (Prompt-String); Standard ist "$". PS2 Die sekundäre Eingabeanforderung; Standard ist "> ". IFS Die internen Trennzeichen; Standard sind Leerzeichen , Tabulator und Newline . Interpretation der Freiräume Nachdem die Parameter- und Kommandosubstitution ausgeführt sind, wird das entstandene Resultat nach eventuell vorhandenen internen Trennzeichen (wie sie in $IFS angegeben sind) durchsucht. Die Stellen, an denen solche Zei- chen gefunden werden, markieren jeweils den Beginn eines neuen Argumentes. Explizite Null-Argumente ("" oder '') bleiben erhalten, während implizite - 3 - SH(1) MUTOS SH(1) Null-Argumente, die aus nichtgesetzten _P_a_r_a_m_e_t_e_r_n resultieren, gelöscht werden. File-Namen-Generierung Nach den bisher geschilderten Ersetzungen wird jedes Wort des Kommandos nach den Zeichen *, ? und [ durchsucht. Wird in einem Wort ein solches Zeichen gefunden, so wird dieses Wort als Muster aufgefaßt und durch die alphabetisch sortierte Folge aller File-Namen ersetzt, die dem Muster ent- sprechen. Wird kein File-Name gefunden, der dem vorgegebenen Muster ent- spricht, so wird dieses Muster unverändert als Argument übergeben. Das Zeichen . am Beginn eines File-Namens sowie unmittelbar nach einem /, und das Zeichen / selbst, müssen explizit angegeben werden. * entspricht einer beliebigen Zeichenkette, einschließlich der Null- Zeichenkette. ? entspricht einem beliebigen einzelnen Zeichen. [...] entspricht jedem der in den eckigen Klammern angegebenen Zeichen. Ein Zeichenpaar, das durch "-" getrennt ist, entspricht allen Zeichen, die lexikalisch zwischen diesen beiden Zeichen liegen. Apostrophieren Die folgenden Zeichen haben eine besondere Bedeutung für Shell. Werden sie nicht _a_p_o_s_t_r_o_p_h_i_e_r_t, so bewirken sie die Beendigung eines Wortes. ; & ( ) | < > Newline Leerzeichen Tabulator Ein Zeichen kann durch Voranstellen von "\" apostrophiert werden. Dadurch wird, zum Beispiel, "Newline" von Shell ignoriert. Auch alle Zeichen, außer einem Apostroph, die in ein Paar von Apostrophen ('') eingeschlossen sind, gelten als apostrophiert und verlieren ihre besondere Bedeutung für Shell. Innerhalb von Anführungsstrichen ("""""") wird Parameter- und Kommando- substitution durchgeführt. Durch \ können hier die Zeichen \ ` und $ apo- strophiert werden. "$*" entspricht "$1 $2 ..." und "$@" entspricht "$1" "$2" ... . Eingabeanforderungen Im interaktiven Verkehr zeigt Shell seine Bereitschaft, Eingaben vom Nutzer-Terminal zu lesen, durch Ausgabe des Wertes von PS1 auf dem Bild- schirm an. Falls zu irgendeiner Zeit nach der Eingabe eines Newline- Zeichens weitere Eingaben durch den Nutzer erforderlich sind, um ein Kom- mando korrekt zu beenden, so gibt Shell den Wert von PS2 auf dem Bildschirm aus. Ein- und Ausgaben Vor der Ausführung eines Kommandos können dessen Ein- und Ausgaberichtung verändert werden. Dies wird durch eine spezielle Notation erreicht, die von Shell interpretiert und nicht als Argument an das zugehörige Kommando weitergegeben wird. Die nachfolgend angegebenen Möglichkeiten zur E/A-Richtungsänderung können an einer beliebigen Stelle in einem _e_i_n_f_a_c_h_e_n _K_o_m_m_a_n_d_o erscheinen oder einem _K_o_m_m_a_n_d_o voran- bzw. nachgestellt sein. Angegebene Substitutionen werden durchgeführt, bevor _W_o_r_t oder _Z_i_f_- _f_e_r benutzt werden. - 4 - SH(1) MUTOS SH(1) <_W_o_r_t Das File _W_o_r_t wird als Standardeingabe (File-Deskriptor 0) benutzt. >_W_o_r_t Das File _W_o_r_t wird als Standardausgabe (File-Deskriptor 1) benutzt. Falls dieses File noch nicht existiert, so wird es erstellt. Andern- falls wird es auf die Länge Null gebracht, d.h. der alte Inhalt ist verloren. >>_W_o_r_t Das File _W_o_r_t wird als Standardausgabe benutzt. Falls dieses File noch nicht existiert, so wird es erstellt. Andernfalls wird das File-Ende gesucht, so daß folgende Ausgaben an den alten Inhalt angefügt werden. <<_W_o_r_t Alle folgenden Eingaben bis zu einer Zeile, die gleich _W_o_r_t ist, oder bis zum Erreichen von End-of-File werden eingelesen. Das resultierende "Paket" von Eingaben wird als Standardeingabe benutzt. Falls ein Zeichen aus _W_o_r_t apostrophiert ist, werden für das Eingabe- paket keinerlei Interpretationen durchgeführt. Andernfalls werden Parameter- und Kommandosubstitutionen durchgeführt, Newline wird igno- riert, und \ dient dem Apostrophieren von \ $ ` und dem ersten Zeichen von _W_o_r_t. <&_Z_i_f_f_e_r Die Standardeingabe wird ein Duplikat des File-Deskriptors _Z_i_f_f_e_r (siehe dup(2)). Analog geschieht das Duplizieren für die Standardaus- gabe bei Benutzung von ">". <&- Die Standardeingabe wird geschlossen. Zum Schließen der Standardaus- gabe wird ">" benutzt. Wird einer dieser Formen der E/A-Richtungsänderung eine Ziffer vorange- stellt, so bezieht sich die beabsichtigte Richtungsänderung auf den durch die Ziffer angegebenen File-Deskriptor und nicht, wie im Standardfall, auf die Deskriptoren 0 und 1. So wird, zum Beispiel, durch ... 2>&1 erreicht, daß File-Deskriptor 2 ein Duplikat des File-Deskriptors 1 wird. Für Hintergrund-Kommandos (abgeschlossen mit &) ist das leere File /dev/null Standardeingabe. Für andere Kommandos enthält die Ausführungs- umgebung die gleichen File-Deskriptoren, die der aufrufende Shell-Prozeß hat, jedoch entsprechend den angegebenen E/A-Richtungsänderungen modifi- ziert. Umgebung Die Umgebung ist eine Liste von Paaren der Form Name-Wert, die wie die Liste der Argumente durch Shell an ein auszuführendes Programm übergeben wird (siehe exec(2) und environ(5)). Shell kommuniziert mit der Umgebung auf verschiedene Arten. Beim Aufruf wird für jeden Namen, der in der Umgebung enthalten ist, ein _P_a_r_a_m_e_t_e_r erstellt und mit dem zugehörigen Wert belegt. Auszuführende Kommandos "erben" die Umgebung von Shell. Wenn der Nutzer die Werte dieser _P_a_r_a_m_e_t_e_r verändert oder neue _P_a_r_a_m_e_t_e_r einführt, so hat dies keinen Einfluß auf die Umgebung. Nur mit Hilfe des export- Kommandos können Shell-Parameter an die Umgebung angebunden werden. Zur - 5 - SH(1) MUTOS SH(1) Umgebung eines auszuführenden Kommandos gehören daher alle nichtveränderten Paare der Form Name-Wert, die bereits in der Umgebung von Shell enthalten waren, sowie alle Modifikationen oder Ergänzungen, für die export-Kommandos ausgeführt wurden. Die Umgebung eines _e_i_n_f_a_c_h_e_n _K_o_m_m_a_n_d_o_s kann erweitert werden, indem diesem beim Aufruf eine oder mehrere _P_a_r_a_m_e_t_e_r-Zuweisungen vorangestellt werden (Kennwort-Parameter). Die folgenden zwei Kommandozeilen sind daher äquiva- lent. TERM=8911 cmd args (export TERM; TERM=8911; cmd args) Wenn die Option -k angegeben ist, werden _a_l_l_e Kennwort-Argumente in die Umgebung des zugehörigen Kommandos eingebunden, auch wenn sie nach dem Kom- mandonamen angegeben sind. Durch echo a=b c set -k echo a=b c enstehen die Ausgaben "a=b c" und "c". Signale Die Signale haben in einem Shell-Prozeß normalerweise die Werte, die ihnen auch im jeweiligen Parent-Prozeß zugeordnet waren. Eine Ausnahme bilden Hintergrund-Prozesse. Diese ignorieren die Signale 2 (INTERRUPT) und 3 (QUIT). Den Signalen können mit dem trap-Kommando jedoch andere Werte zugewiesen werden. Ausführung Vor jeder Kommandoausführung werden die oben genannten Substitutionen durchgeführt. Außer für die unten angeführten "Speziellen Kommandos" wird zur Kommandoausführung ein neuer Prozeß geschaffen und versucht, das Kom- mando mittels eines Systemrufes (exec(2)) abzuarbeiten. Der Shell-Parameter $PATH legt den