Verkettung und Zusammenfassung von Kommandos
HintereinanderausführungWill man mehrere Kommandos ausführen lassen, braucht man nichtjedes Kommando einzeln einzugeben und mit der Eingabe des nächstenKommandos auf die Beendigung des vorhergehenden warten. Die Kommandos werden,getrennt durch Strichpunkt, hintereinander geschrieben: kommando1 ; kommando2; kommando3 Sequentielles UNDDas zweite Kommando wird nur dann ausgeführt, wenn das erste erfolgreich war.
Kommando1 && Kommando2
Für die Bewertung der Abarbeitung wird folgende Wahrheitstabelle verwendet:
Exitstatus Kommando 1 |
Exitstatus Kommando 2 |
&&-Verkettung |
Exitstatus gleich 0 --> ok |
Exitstatus gleich 0 --> ok |
Exitstatus gleich 0 --> ok |
Exitstatus gleich 0 --> ok |
Exitstatus ungleich 0 --> nicht ok |
Exitstatus ungleich 0 --> nicht ok |
Exitstatus ungleich 0 --> nicht ok |
wird nicht gestartet! |
Exitstatus ungleich 0 --> nicht ok |
Sequentielles EXOR
(EXOR gleich Exklusives ODER) Das zweite Kommando wird nur dann ausgeführt,
wenn das erste erfolglos war.
Kommando1 || Kommando2
Für die Bewertung der Abarbeitung wird folgende Wahrheitstabelle verwendet:
Exitstatus Kommando 1 |
Exitstatus Kommando 2 |
||-Verkettung |
Exitstatus gleich 0 --> ok |
wird nicht gestartet! |
Exitstatus gleich 0 --> ok |
Exitstatus ungleich 0 --> nicht ok |
Exitstatus gleich 0 --> ok |
Exitstatus gleich 0 --> ok |
Exitstatus ungleich 0 --> nicht ok |
Exitstatus ungleich 0 --> nicht ok |
Exitstatus ungleich 0 --> nicht ok |
Zusammenfassung von Kommandos
Kommandofolgen lassen sich - analog der Blockstruktur höherer Sprachen - logisch
klammern. Das Problem der normalen Hintereinander-Ausführung mit Trennung durch ";"
ist die Umleitung von Standardeingabe und Standardausgabe, z. B.:
pwd > out ; who >> out ; ls >> out
Die Umleitung läßt sich auch auf die Fehlerausgabe erweitern
echo "Fehler!" # geht nach stdout
echo "Fehler!" 1>&2 # geht nach stderr
Kommandos lassen sich zur gemeinsamen E/A-Umleitung mit {...} klammern:
{ Kommando1 ; Kommando2 ; Kommando3 ; ... ; }
Wichtig: Die geschweiften Klammern müssen von Leerzeichen
eingeschlossen werden!
Die Ausführung der Kommandos erfolgt nacheinander innerhalb der aktuellen Shell,
die Ausgabe kann gemeinsam umgelenkt werden, z. B.:
{ pwd ; who ; ls ; } > out
Die schließende Klammer muß entweder durch einen Strichpunkt vom letzen
Kommando getrennt werden oder am Beginn einer neuen Zeile stehen. Die geschweiften
Klammern sind ein ideales Mittel, die Ausgabe aller Programme eines Shell-Skripts
gemeinsam umzuleiten, wenn das Skript beispielsweise mit 'nohup' oder über
cron gestartet wird. Man fügt lediglich am Anfang eine Zeile mit der öffnenden
Klammer ein und am Schluß die gewünschte Umleitung, z. B.:
{
...
...
...
...
} | mailx -s "Output from Foo" $LOGNAME
Eine Folge von Kommandos kann aber auch in einer eigenen Subshell ausgeführt
werden:
( Kommando1 ; Kommando2 ; Kommando3 ; ... )
Das Ergebnis des letzten ausgeführten Kommados wird als Ergebnis der Klammer
zurückgegeben. Auch hier kann die Umleitung der Standardhandles gemeinsam
erfolgen. Auch dazu ein Beispiel. Bei unbewachten Terminals "bastle"
ich gerne an der Datei '.profile' des Users. Eine Zeile
( sleep 300 ; audioplay /home/local/sounds/telefon.au ) &
ist schnell eingebaut. Fünf Minuten nach dem Login rennt dann jemand zum Telefon
(geht natürlich nur, wenn der Computer auch soundfähig ist). Noch gemeiner
wäre
( sleep 300 ; kill -9 0 ) &
Abschließend vielleicht noch etwas Nützliches. Wenn Sie feststellen daß
eine Plattenpartition zu klein geworden ist, müssen Sie nach Einbau und
Formatierung einer neuen Platte oftmals ganze Verzeichnisbäme von der alten
Platte auf die neue kopieren. Auch hier hilft die Kommandoverkettung zusammen
mit dem Programm tar (Tape ARchive), das es nicht nur erlaubt, einen
kompletten Verzeichnisbaum auf ein Gerät, etwa einen Streamer, zu kopieren,
sondern auch in eine Datei oder auf die Standardausgabe. Wir verknüpfen einfach
zwei tar-Prozesse, von denen der erste das Verzeichnis archiviert und der zweite
über eine Pipe das Archiv wieder auspackt. Der Trick am ganzen ist, das beide
Prozesse in verschiedenen Verzeichnissen arbeiten. Angenommen wir wollen das
Verzeichnis /usr/local nach /mnt kopieren:
( cd /usr/local ; tar cf - . ) | ( cd /mnt ; tar xvf - )
Der Parameter "f" weist tar an, auf eine Datei zu schreiben oder von einer Datei zu lesen.
Hat die Datei wie oben den Namen "-", handelt es sich um stdout bzw. stdin.
|