L i n u x    B e f e h l    exec

Kommando exec (builtin) Kommando: führt ein Kommando durch - dabei wird der laufende Prozess ersetzt.

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
  1. exec 3>&1 1>output.txt
  2. exec 1>3 3>&-
  1. 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.)

  2. 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: