Zum Inhalt springen

Exec: Unterschied zwischen den Versionen

Aus Foxwiki
Die Seite wurde neu angelegt: „'''topic''' kurze Beschreibung = Beschreibung = = Installation = = Syntax = == Parameter == == Optionen == = Konfiguration = = Anwendungen = = Links = == Date…“
 
Keine Bearbeitungszusammenfassung
 
(54 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
'''topic''' kurze Beschreibung
{{DISPLAYTITLE:exec}}


= Beschreibung =
'''exec''' - Beschreibung
= Installation =
= Syntax =
== Parameter ==
== Optionen ==
= Konfiguration =
= Anwendungen =
= Links =
== Dateien ==
== Man-Pages ==
== Intern ==
== Weblinks ==


=Kontrollfragen=
== Beschreibung ==
<div class="toccolours mw-collapsible mw-collapsed">
Wird ihm als Argument ein Kommandoname mitgegeben, so wird das aktuell ausgeführte Programm (also die Shell bzw.&nbsp;ein Shellskript) durch dieses neue Programm ersetzt
''Testfrage 1''
* Das hat zur Folge, dass mit Beendigung des Kommandos auch die Shell nicht mehr existiert
<div class="mw-collapsible-content">'''Antwort1'''</div>
* Diese Art der Anwendung von exec hat ihren Ursprung vermutlich in Zeiten begrenzter Hardwareressourcen
</div>
* So "optimierte" man Shellskripte dahingehend, dass der letzte Befehl per exec gestartet wurde
<div class="toccolours mw-collapsible mw-collapsed">
* Dies ersparte eine weitere Prozesserzeugung und verlief somit etwas schneller, als es mit einem neuen Prozess der Fall gewesen wäre (und es sparte den (Speicher)Overhead für den Prozess)
''Testfrage 2''
<div class="mw-collapsible-content">'''Antwort2'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 3''
<div class="mw-collapsible-content">'''Antwort3'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 4''
<div class="mw-collapsible-content">'''Antwort4'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 5''
<div class="mw-collapsible-content">'''Antwort5'''</div>
</div>
 
[[Kategorie:Wiki]]
 
= exec =
Das Kommando besitzt zwei Bedeutungen.


Wird ihm als Argument ein Kommandoname mitgegeben, so wird das aktuell ausgeführte Programm (also die Shell bzw. ein Shellskript) durch dieses neue Programm ersetzt. Das hat zur Folge, dass mit Beendigung des Kommandos auch die Shell nicht mehr existiert.
Nützlich mag das Kommando in dem Sinne höchstens zum Ersetzen der aktuellen Shell durch eine andere sein:
 
<syntaxhighlight lang="bash" highlight="1" line="" copy="">
Diese Art der Anwendung von exec hat seinen Ursprung vermutlich in Zeiten begrenzter Hardwareressourcen. So "optimierte" man Shellskripte dahingehend, dass der letzte Befehl per exec gestartet wurde.
echo $SHELL
 
Dies ersparte eine weitere Prozesserzeugung und verlief somit etwas schneller, als es mit einem neuen Prozess der Fall gewesen wäre (und es sparte den (Speicher)Overhead für den Prozess).
 
Nützlich mag das Kommando in dem Sinne höchstens zum Ersetzen der aktuellen Shell durch eine andere sein:  
 
'''echo $SHELL'''
  /bin/bash
  /bin/bash
'''exec tcsh'''
/home/user>


Der zweite - und wichtigere - Anwendungsbereich für exec ist die Zuordnung eines Dateideskriptors zu einer Datei.
exec tcsh
</syntaxhighlight>


Angenommen, Sie möchten alle Fehlerausgaben eines Shellskripts in eine Datei umleiten.
Der zweite - und wichtigere - Anwendungsbereich für exec ist die Zuordnung eines Dateideskriptors zu einer Datei


Mit den bislang bekannten Mitteln könnten sie entweder alle kritschen Kommandos im Shellskript separat umleiten oder Sie könnten alle Kommandos gruppieren und die Fehlerausgabe gemeinsam abfangen.
Angenommen, Sie möchten alle Fehlerausgaben eines Shellskripts in eine Datei umleiten


Einfacher ist es, folgende Zeile an den Anfang des Skripts zu setzen:
Mit den bislang bekannten Mitteln könnten sie entweder alle kritschen Kommandos im Shellskript separat umleiten oder Sie könnten alle Kommandos gruppieren und die Fehlerausgabe gemeinsam abfangen


exec 2>error.log
Einfacher ist es, folgende Zeile an den Anfang des Skripts zu setzen:
<syntaxhighlight lang="bash" highlight="1" line copy>
exec 2>error.log
</syntaxhighlight>


Erläuterung: Hiermit wird die Fehlerausgabe (Deskriptor 2) mit der Datei "error.log" verbunden.
Erläuterung: Hiermit wird die Fehlerausgabe (Deskriptor 2) mit der Datei "error.log" verbunden


Mit Beendigung des Shellskripts geht die Bindung wieder verloren.
Mit Beendigung des Shellskripts geht die Bindung wieder verloren


Das zweite Beispiel demonstriert das Öffnen einer Datei mit exec, sodass die Eingabe aus dieser bezogen wird. Wir simulieren das Kommando nl, das die Zeilen seiner Eingabe nummeriert:  
Das zweite Beispiel demonstriert das Öffnen einer Datei mit exec, sodass die Eingabe aus dieser bezogen wird
 
* Wir simulieren das Kommando nl, das die Zeilen seiner Eingabe nummeriert:
'''(typeset -i n=1; exec < testdat;'''
<syntaxhighlight lang="bash" highlight="1" line="" copy="">
(typeset -i n=1; exec < testdat;
  > while read line; do
  > while read line; do
  > echo "$n $line"; n=n+1;
  > echo "$n $line"; n=n+1;
Zeile 78: Zeile 44:
  3 drei
  3 drei
  4 vier
  4 vier
</syntaxhighlight>


Erläuterung: Die Testdatei enthält die Zeilen "eins", "zwei" usw.; die Eingabe wird aus dieser bezogen. Mittels read wird zeilenweise gelesen und jede Zeile mit vorangestellter Nummer ausgegeben.
; Erläuterung
Die Testdatei enthält die Zeilen "eins", "zwei" und weitere; die Eingabe wird aus dieser bezogen
* Mittels read wird zeilenweise gelesen und jede Zeile mit vorangestellter Nummer ausgegeben


Das Rechnen mit "n" ist möglich, da die Variable zuvor als Ganzzahl vereinbart wurde. Alles wurde in einer Subshell gestartet, damit die aktuelle Shell nicht beendet wird.
Das Rechnen mit "n" ist möglich, da die Variable zuvor als Ganzzahl vereinbart wurde
* Alles wurde in einer Subshell gestartet, damit die aktuelle Shell nicht beendet wird


Ein letztes Beispiel soll die Thematik vorerst beenden (die Shellprogrammierung ist ein wesentlich ergiebigeres Anwendungsfeld für exec).
Ein letztes Beispiel soll die Thematik vorerst beenden (die Shellprogrammierung ist ein wesentlich ergiebigeres Anwendungsfeld für exec)
 
Es demonstriert eine effiziente Möglichkeit, eine konkrete Zeile einer Datei zu manipulieren. Unsere Testdaten seien die Folgenden:


Es demonstriert eine effiziente Möglichkeit, eine konkrete Zeile einer Datei zu manipulieren
* Unsere Testdaten seien die Folgenden:
<syntaxhighlight lang="bash" highlight="1" line copy>
  '''cat testfile'''
  '''cat testfile'''
  Erste Zeile.
  Erste Zeile
  Zweite Zeile.
  Zweite Zeile
  Zweite Zeile.
  Zweite Zeile
  Vierte Zeile.
  Vierte Zeile
</syntaxhighlight>


Aus der Datei müssen wir nicht nur lesen, sondern gleichzeitig in diese schreiben können. Wir werden nach der Zeile "Zweite Zeile." suchen und die folgende Zeile durch "Dritte Zeile." ersetzen.
Aus der Datei müssen wir nicht nur lesen, sondern gleichzeitig in diese schreiben können
 
* Wir werden nach der Zeile "Zweite Zeile." suchen und die folgende Zeile durch "Dritte Zeile." ersetzen
Eine Kommandofolge, die dies realisiert, ist diese:


Eine Kommandofolge, die dies realisiert, ist diese:
<syntaxhighlight lang="bash" highlight="1" line copy>
  '''(exec <>testfile 1>&0'''
  '''(exec <>testfile 1>&0'''
  > while read line; do
  > while read line; do
  > echo $line | grep -q "Zweite*" && echo -n "Dritte Zeile."
  > echo $line | grep -q "Zweite*" && echo -n "Dritte Zeile."
  > done)  
  > done)
</syntaxhighlight>


Erläuterung: Die Eingabedatei zum Lesen und Schreiben zu öffnen, würde allein nichts nützen, da hiermit nur der Dateideskriptor (Nummer 0) betroffen ist.
; Erläuterung
Die Eingabedatei zum Lesen und Schreiben zu öffnen, würde allein nichts nützen, da hiermit nur der Dateideskriptor (Nummer 0) betroffen ist


Deshalb muss die Standardausgabe ebenfalls auf diesen Deskriptor umgelenkt werden. Wird die mit "Zweite..." beginnende Zeile gefunden, zeigt der Dateizeiger bereits auf den Beginn der dritten Zeile. Deshalb landet die Ausgabe "echo..." genau dort.
Deshalb muss die Standardausgabe ebenfalls auf diesen Deskriptor umgelenkt werden
* Wird die mit "Zweite..." beginnende Zeile gefunden, zeigt der Dateizeiger bereits auf den Beginn der dritten Zeile
* Deshalb landet die Ausgabe "echo..." genau dort


Wenn Sie Zweifel an den Optionen von grep bzw. echo hegen, so testen Sie, was passiert, wenn Sie diese entfernen.  
Wenn Sie Zweifel an den Optionen von grep bzw.&nbsp;echo hegen, so testen Sie, was passiert, wenn Sie diese entfernen
<syntaxhighlight lang="bash" highlight="1" line copy>
'''exec '''
</syntaxhighlight>
 
Ähnlich wie beim Dot-Kommando wird keine Subshell erzeugt, sondern die Kommandozeile in der aktuellen Umgebung ausgeführt
 
Eine erste Anwendung liegt darin, das aktuelle Programm durch ein anderes zu überlagern
* Wenn Sie beispielsweise die Bourne-Shell als Login-Shell haben, aber lieber mit der C-Shell arbeiten, können sie die Bourne-Shell durch die Kommandozeile
<syntaxhighlight lang="bash" highlight="1" line copy>
exec /bin/csh
</syntaxhighlight>
 
als letzte Zeile in der .profile-Datei durch die C-shell ersetzen (Wenn Sie die C-Shell nur Aufrufen, müssen Sie beide Shells beenden, um sich auszuloggen)
 
Das Kommando entspricht also dem Systemcall exec()
* Wird jedoch kein Kommando angegeben, kann die E/A der aktuellen Shell dauerhaft umgeleitet werden
 
; Beispiel
<syntaxhighlight lang="bash" highlight="1" line copy>
exec 2>fehler
</syntaxhighlight>
 
leitet alle folgenden Fehlerausgaben in die Datei "fehler" um, bis die Umleitung explizit durch
<syntaxhighlight lang="bash" highlight="1" line copy>
exec 2>-
</syntaxhighlight>
 
zurückgenommen wird
* Es können bei exec auch andere Dateideskriptoren verwendet werden
 
Ebenso kann auch die Dateiumleitung einer Eingabedatei erfolgen, beispielsweise :
<syntaxhighlight lang="bash" highlight="1" line copy>
exec 3< datei
</syntaxhighlight>
 
Danach kann mit read <&3 von dieser Datei gelesen werden, bis die Umleitung mit exec 3<- wieder zurückgenommen wird


'''exec '''
Man kann also in Shellskripten durch das Einfügen einer exec-Anweisung die Standardausgabe/-eingabe global für das gesamte Skript umleiten, ohne weitere Änderungen vornehmen zu müssen (eine andere Möglichkeit wäre die oben beschriebene Verwendung von { })
 
{{SORTIERUNG:exec}}
[[Kategorie:Linux/Befehl]]
[[Kategorie:Linux/Prozess/Befehl]]
[[Kategorie:Bash/Builtin]]
[[Kategorie:Bash/Scripting]]
[[Kategorie:Bash/Interaktiv]]
 
== Aufruf ==
<syntaxhighlight lang="bash" highlight="1" line copy>
</syntaxhighlight>


Ähnlich wie beim Dot-Kommando wird keine Subshell erzeugt, sondern die Kommandozeile in der aktuellen Umgebung ausgeführt.
=== Optionen ===
{| class="wikitable sortable options gnu big"
|-
! Unix !! GNU !! Parameter !! Beschreibung
|-
| || || ||
|-
|}


Eine erste Anwendung liegt darin, das aktuelle Programm durch ein anderes zu überlagern. Wenn Sie z. B. die Bourne-Shell als Login-Shell haben, aber lieber mit der C-Shell arbeiten, können sie die Bourne-Shell durch die Kommandozeile
=== Parameter ===
=== Umgebungsvariablen ===
=== Exit-Status ===
{| class="wikitable options col1center big"
|-
! Wert !! Beschreibung
|-
| 0 || Erfolg
|-
| >0 || Fehler
|}


exec /bin/csh
== Anwendung ==
<syntaxhighlight lang="bash" highlight="1" line copy>
</syntaxhighlight>


als letzte Zeile in der .profile-Datei durch die C-shell ersetzen (Wenn Sie die C-Shell nur Aufrufen, müssen Sie beide Shells beenden, um sich auszuloggen).
=== Problembehebung ===


Das Kommando entspricht also dem Systemcall exec(). Wird jedoch kein Kommando angegeben, kann die E/A der aktuellen Shell dauerhaft umgeleitet werden. Beispiel:
== Konfiguration ==
=== Dateien ===
{| class="wikitable options big"
|-
! Datei !! Beschreibung
|-
| ||
|-
| ||
|}


exec 2>fehler
<noinclude>


leitet alle folgenden Fehlerausgaben in die Datei "fehler" um, bis die Umleitung explizit durch
== Anhang ==
=== Siehe auch ===
<div style="column-count:2">
<categorytree hideroot=on mode="pages">{{BASEPAGENAME}}</categorytree>
</div>
----
{{Special:PrefixIndex/{{BASEPAGENAME}}/}}


exec 2>-  
=== Dokumentation ===
<!--
; Man-Page
# [https://manpages.debian.org/stable/procps/pgrep.1.de.html prep(1)]


zurückgenommen wird. Es können bei exec auch andere Dateideskriptoren verwendet werden. Ebenso kann auch die Dateiumleitung einer Eingabedatei erfolgen, z. B.:


exec 3< datei
; Info-Pages
-->


Danach kann mit read <&3 von dieser Datei gelesen werden, bis die Umleitung mit exec 3<- wieder zurückgenommen wird.
=== Links ===
==== Projekt ====
==== Weblinks ====
{{DISPLAYTITLE:new}}


Man kann also in Shellskripten durch das Einfügen einer exec-Anweisung die Standardausgabe/-eingabe global für das gesamte Skript umleiten, ohne weitere Änderungen vornehmen zu müssen (eine andere Möglichkeit wäre die oben beschriebene Verwendung von { }).
</noinclude>

Aktuelle Version vom 4. Februar 2026, 09:39 Uhr


exec - Beschreibung

Beschreibung

Wird ihm als Argument ein Kommandoname mitgegeben, so wird das aktuell ausgeführte Programm (also die Shell bzw. ein Shellskript) durch dieses neue Programm ersetzt

  • Das hat zur Folge, dass mit Beendigung des Kommandos auch die Shell nicht mehr existiert
  • Diese Art der Anwendung von exec hat ihren Ursprung vermutlich in Zeiten begrenzter Hardwareressourcen
  • So "optimierte" man Shellskripte dahingehend, dass der letzte Befehl per exec gestartet wurde
  • Dies ersparte eine weitere Prozesserzeugung und verlief somit etwas schneller, als es mit einem neuen Prozess der Fall gewesen wäre (und es sparte den (Speicher)Overhead für den Prozess)

Nützlich mag das Kommando in dem Sinne höchstens zum Ersetzen der aktuellen Shell durch eine andere sein:

echo $SHELL
 /bin/bash

exec tcsh

Der zweite - und wichtigere - Anwendungsbereich für exec ist die Zuordnung eines Dateideskriptors zu einer Datei

Angenommen, Sie möchten alle Fehlerausgaben eines Shellskripts in eine Datei umleiten

Mit den bislang bekannten Mitteln könnten sie entweder alle kritschen Kommandos im Shellskript separat umleiten oder Sie könnten alle Kommandos gruppieren und die Fehlerausgabe gemeinsam abfangen

Einfacher ist es, folgende Zeile an den Anfang des Skripts zu setzen:

exec 2>error.log

Erläuterung: Hiermit wird die Fehlerausgabe (Deskriptor 2) mit der Datei "error.log" verbunden

Mit Beendigung des Shellskripts geht die Bindung wieder verloren

Das zweite Beispiel demonstriert das Öffnen einer Datei mit exec, sodass die Eingabe aus dieser bezogen wird

  • Wir simulieren das Kommando nl, das die Zeilen seiner Eingabe nummeriert:
(typeset -i n=1; exec < testdat;
 > while read line; do
 > echo "$n $line"; n=n+1;
 > done)
 1 eins
 2 zwei
 3 drei
 4 vier
Erläuterung

Die Testdatei enthält die Zeilen "eins", "zwei" und weitere; die Eingabe wird aus dieser bezogen

  • Mittels read wird zeilenweise gelesen und jede Zeile mit vorangestellter Nummer ausgegeben

Das Rechnen mit "n" ist möglich, da die Variable zuvor als Ganzzahl vereinbart wurde

  • Alles wurde in einer Subshell gestartet, damit die aktuelle Shell nicht beendet wird

Ein letztes Beispiel soll die Thematik vorerst beenden (die Shellprogrammierung ist ein wesentlich ergiebigeres Anwendungsfeld für exec)

Es demonstriert eine effiziente Möglichkeit, eine konkrete Zeile einer Datei zu manipulieren

  • Unsere Testdaten seien die Folgenden:
 '''cat testfile'''
 Erste Zeile
 Zweite Zeile
 Zweite Zeile
 Vierte Zeile

Aus der Datei müssen wir nicht nur lesen, sondern gleichzeitig in diese schreiben können

  • Wir werden nach der Zeile "Zweite Zeile." suchen und die folgende Zeile durch "Dritte Zeile." ersetzen

Eine Kommandofolge, die dies realisiert, ist diese:

 '''(exec <>testfile 1>&0'''
 > while read line; do
 > echo $line | grep -q "Zweite*" && echo -n "Dritte Zeile."
 > done)
Erläuterung

Die Eingabedatei zum Lesen und Schreiben zu öffnen, würde allein nichts nützen, da hiermit nur der Dateideskriptor (Nummer 0) betroffen ist

Deshalb muss die Standardausgabe ebenfalls auf diesen Deskriptor umgelenkt werden

  • Wird die mit "Zweite..." beginnende Zeile gefunden, zeigt der Dateizeiger bereits auf den Beginn der dritten Zeile
  • Deshalb landet die Ausgabe "echo..." genau dort

Wenn Sie Zweifel an den Optionen von grep bzw. echo hegen, so testen Sie, was passiert, wenn Sie diese entfernen

 '''exec '''

Ähnlich wie beim Dot-Kommando wird keine Subshell erzeugt, sondern die Kommandozeile in der aktuellen Umgebung ausgeführt

Eine erste Anwendung liegt darin, das aktuelle Programm durch ein anderes zu überlagern

  • Wenn Sie beispielsweise die Bourne-Shell als Login-Shell haben, aber lieber mit der C-Shell arbeiten, können sie die Bourne-Shell durch die Kommandozeile
 exec /bin/csh

als letzte Zeile in der .profile-Datei durch die C-shell ersetzen (Wenn Sie die C-Shell nur Aufrufen, müssen Sie beide Shells beenden, um sich auszuloggen)

Das Kommando entspricht also dem Systemcall exec()

  • Wird jedoch kein Kommando angegeben, kann die E/A der aktuellen Shell dauerhaft umgeleitet werden
Beispiel
 exec 2>fehler

leitet alle folgenden Fehlerausgaben in die Datei "fehler" um, bis die Umleitung explizit durch

 exec 2>-

zurückgenommen wird

  • Es können bei exec auch andere Dateideskriptoren verwendet werden

Ebenso kann auch die Dateiumleitung einer Eingabedatei erfolgen, beispielsweise :

 exec 3< datei

Danach kann mit read <&3 von dieser Datei gelesen werden, bis die Umleitung mit exec 3<- wieder zurückgenommen wird

Man kann also in Shellskripten durch das Einfügen einer exec-Anweisung die Standardausgabe/-eingabe global für das gesamte Skript umleiten, ohne weitere Änderungen vornehmen zu müssen (eine andere Möglichkeit wäre die oben beschriebene Verwendung von { })

Aufruf

Optionen

Unix GNU Parameter Beschreibung

Parameter

Umgebungsvariablen

Exit-Status

Wert Beschreibung
0 Erfolg
>0 Fehler

Anwendung

Problembehebung

Konfiguration

Dateien

Datei Beschreibung


Anhang

Siehe auch



Dokumentation

Links

Projekt

Weblinks