ANLASS:
führt Kommando durch, nachdem der laufende Prozess beendet wurde (und vom durchzuführenden Befehl ersetzt wird).
LÖSUNG:
Es ist eine kritische Funktion in einer
Unix-Umgebung.
Normalerweise, um einen neuen Prozess zu erzeugen wird das Kommando fork verwendet.
SYNTAX: exec [-c] [-l] [-a name] [command[arguments...]] [redirection...]
Option |
Bedeutung |
-a name |
Die Zeichenkette name wird als das Argument 0 (bash shell Variable $0) des aufzurufenden Kommandos
(anstelle des Namens von Kommando command).
|
-c |
Das Kommando command wird in einer leeren Umgebung durchgeführt.
|
-l |
Ein Minus-Zeichen wird vor das Argument 0 ($0) des durchzuführenden Kommandos hinzugefügt
- um eine login-Shell via exec aufzurufen.
|
Tab. Optionen von exec
Anm.: Ich habe ich exec nur im Zusammenhang mit der Datenstrom-Umleitung (redirection) verwendet.
Gerade die Datenstrom-Umleitung auf der Kommandozeile kann zu erheblichen Problemen, wenn fehlerhaft eingetippt oder falsch verstanden.
Es ist insbesondere wichtig, den Begriff des Dateideskriptors (file descriptor) zu verstehen: eine Ganzzahl,
die von Unix/Linux zur Ermittlung der Referenz auf eine Datei verwendet wird.
In Unix Datenströme fließen von "Datei"
zu "Datei": Dateneingabe, Datenausgabe und Fehlerausgabe werden als Dateien behandelt.
-
Die Standard- Dateneingabe stdin wird der Tastatur gleichgestellt und dem "Dateideskriptoren" 0 zugeordnet.
-
Die Standard- Datenausgabe stdout wird dem Bildschirm gleichgestellt und dem "Dateideskriptoren" 1 zugeordnet.
-
Die Standard- Fehlerausgabe stderr wird dem Bildschirm gleichgestellt und dem "Dateideskriptoren" 2 zugeordnet.
bash erlaubt über exec eine Neuzuordnung der Deskriptoren 0, 1, 2 (auf andere "Dateien" als stdin, stdout, stderr).
Hier sind einige Einwendungsbeispiele:
01 |
- exec 3>&1 1>output.txt
- exec 1>3 3>&-
|
-
Die Referenz zu stdout (Bildschirm) wird (auf Dateideskriptor 3) gesichert. Der Dateideskriptor 1 wird dann auf Datei "output.txt" umgeleitet.
(Beachte: Man hätte Zeile 1 auf zwei Zeile verteilen können:
exec 3>&1 und exec 1>output.txt.)
-
Will man den Bildschirm als Datenstromausgabe wiederherstellen, muss man seine Referenz (auf Dateideskriptor 3 gesichert) wieder einsetzen.
Die Referenz von Deskriptor 3 wird dann gelöscht, da nicht mehr benötigt.
Man beachte die Syntax, um einen Ausgabedatei-Deskriptor n zu schließen (dereferenzieren): exec n>&-
oder einen Eingabedatei-Deskriptor n zu schließen: exec n<&-.
Die Vorgehensweise oben - via Sicherung der Referenzen bevor Umleitung der Dateideskriptoren -
funktioniert auf allen System. Einfacher ist es, die System-Referenzen auf
stdin, stdout und stderr direkt zu verwenden,
wenn bekannt:
Auf meinem Linux-System
sind es: /dev/sdtin, /dev/stdout und /dev/stderr.
Ohne den Umweg über Dateideskriptor 3, kann ich z.B. exec 1>/dev/stdout
eintippen, um die ursprüngliche Konfiguration wiederherzustellen.
|
02 |
exec 3< input.txt
|
Öffne Datei input.txt zum lesen ( < ) auf Dateideskriptor 3.
|
Tab. Neu Zuordnung der Deskriptoren
Weiterführende Infos entnehmen Sie bitte folgenden Links:
Meine Beispiele von Anwendungen bezüglich exec:
|