3.10 Subshells und Kommandogruppen
In der Shell können nicht nur einfach Kommandos aneinandergereiht werden. Es gibt neben den bloßen (bedingten) Aneinanderreihungen von Kommandos nämlich noch zwei Möglichkeiten, dies zu organisieren.
Prozessgruppe
Die erste Möglichkeit ist eine Prozessgruppe. Diese Prozessgruppe beinhaltet dabei die aneinandergereihten Prozesse. Dies bietet dem Anwender neue Möglichkeiten, etwa die Ausgabeumlenkung für die gesamte Prozessgruppe. Eine Prozessgruppe wird durch zwei geschweifte Klammern begrenzt. Innerhalb der Prozessgruppe können die in Abschnitt 3.7.2 besprochenen Bedingungen zur Ausführung (etwa das Semikolon zur unbedingten Ausführung) verwendet werden.
$ { ls; uname } | tee log.txt CVS Makefile TODO ZEITPLAN anhg_komref.aux anhg_komref.tex ... Linux
Listing 3.57 Prozessgruppe
Ohne Prozessgruppe müsste nun die Ausgabe jedes Prozesses explizit umgelenkt werden, aber durch diese Prozessgruppe benötigen wir nur eine Ausgabeumlenkung, die wir in diesem Fall durch eine Pipe mit tee ersetzt haben.
Subshell
Startet man hingegen durch Verwendung normaler Klammern eine komplette Subshell (und damit einen neuen Prozess mit eigenen Bereichen im Stack) für eine Prozessgruppe, so bekommt diese Subshell auch ihre eigenen Variablen.
Wenn Sie also in der Subshell die Werte von Variablen verändern, so ändern sich die Werte nicht in der Parent-Shell.
user$ katze=Felix user$ ( katze=Mauzi; echo $katze ) Mauzi user$ echo $katze Felix user$ { katze=Minka ; echo $katze } Minka user$ echo $katze Minka
Listing 3.58 Das unterschiedliche Verhalten mit Shell-Variablen
Später werden wir uns noch mit der unterschiedlichen Nutzung von lokalen und globalen Variablen in Shellskriptfunktionen beschäftigen.
Prozessgruppen im Hintergrund
Prozessgruppen können völlig problemlos im Hintergrund gestartet werden. Möchten Sie beispielsweise eine länger dauernde Dateisuche im Hintergrund ablaufen lassen, ist dies möglich, indem Sie die Anweisung, den Prozess im Hintergrund zu starten (&), hinter die schließende Prozessgruppenklammer stellen: { find / -name Dateiname ; find / -name DateinameB &}