it-swarm.com.de

Was kann der Befehl exec bewirken?

Ich lerne den Befehl exec. Ich weiß, dass der Befehl exec den Prozess ersetzt, der ihn gestartet hat. Es ist also nicht möglich, zu dem Prozess zurückzukehren, der durch den Befehl exec ersetzt wird.

Man könnte sagen, dass es das Ziel ist, es unmöglich zu machen, zu dem Prozess zurückzukehren, der es gestartet hat.

Aber wofür steht noch etwas wie exec als Befehl zur Verfügung?

9
mizech

Im Wrapper-Skript

exec wird hauptsächlich in Wrapper-Skripten verwendet.

Wenn Sie die Umgebung für ein Programm ändern möchten, bevor Sie das Hauptprogramm ausführen, schreiben Sie häufig ein Skript und starten am Ende das Hauptprogramm. Zu diesem Zeitpunkt muss das Skript jedoch nicht im Speicher bleiben. In diesen Fällen wird also exec verwendet, damit das Hauptprogramm das Mutterskript ersetzen kann.

Hier ist ein praktisches Beispiel dafür. Es ist das Skript mate-terminal.wrapper, das mit dem Mate-Terminal geliefert wird. Es startet den mate-terminal mit einigen zusätzlichen Argumenten, indem es die Umgebungen des Benutzers überprüft.

#!/usr/bin/Perl -w

my $login=0;

while ($opt = shift(@ARGV))
{
    if ($opt eq '-display')
    {
        $ENV{'DISPLAY'} = shift(@ARGV);
    }
    elsif ($opt eq '-name')
    {
        $arg = shift(@ARGV);
        Push(@args, "--window-with-profile=$arg");
    }
    elsif ($opt eq '-n')
    {
        # Accept but ignore
        print STDERR "$0: to set an icon, please use -name <profile> and set a profile icon\n"
    }
    elsif ($opt eq '-T' || $opt eq '-title')
    {
        Push(@args, '-t', shift(@ARGV));
    }
    elsif ($opt eq '-ls')
    {
        $login = 1;
    }
    elsif ($opt eq '+ls')
    {
        $login = 0;
    }
    elsif ($opt eq '-geometry')
    {
        $arg = shift(@ARGV);
        Push(@args, "--geometry=$arg");
    }
    elsif ($opt eq '-fn')
    {
        $arg = shift(@ARGV);
        Push(@args, "--font=$arg");
    }
    elsif ($opt eq '-fg')
    {
        $arg = shift(@ARGV);
        Push(@args, "--foreground=$arg");
    }
    elsif ($opt eq '-bg')
    {
        $arg = shift(@ARGV);
        Push(@args, "--background=$arg");
    }
    elsif ($opt eq '-tn')
    {
       $arg = shift(@ARGV);
       Push(@args, "--termname=$arg");
    }
    elsif ($opt eq '-e')
    {
        $arg = shift(@ARGV);
        if (@ARGV)
        {
            Push(@args, '-x', $arg, @ARGV);
            last;
        }
        else
        {
            Push(@args, '-e', $arg);
        }
        last;
    }
    elsif ($opt eq '-h' || $opt eq '--help')
    {
        Push(@args, '--help');
    }
}
if ($login == 1)
{
    @args = ('--login', @args);
}
exec('mate-terminal',@args);

Hier ist zu beachten, dass es einen exec -Aufruf gibt, der dieses Skript im Speicher ersetzt.

Hier finden Sie eine ähnliche Frage, die auf der Unix- und Linux-StackExchange-Site beantwortet wird - https://unix.stackexchange.com/q/270929/19288

Umleiten von Dateideskriptoren

Eine andere gebräuchliche Verwendung von exec ist das Umleiten von Dateideskriptoren. stdin, stdout, stderr können mit exec in Dateien umgeleitet werden.

  1. Das Umleiten von stdout - exec 1>file bewirkt, dass die Standardausgabe eine Datei mit dem Namen file für das Ende der aktuellen Shell-Sitzung ist. Alles, was auf dem Display ausgegeben werden soll, befindet sich in der Datei.

  2. stdin umleiten - Kann auch verwendet werden, um stdin in eine Datei umzuleiten. Wenn Sie beispielsweise eine Skriptdatei script.sh ausführen möchten, können Sie stdin einfach mit exec 0<script.sh in die Datei umleiten.

9
Anwar

Der Befehl exec ersetzt den aktuellen Shell-Prozess durch den angegebenen Befehl. Normalerweise wird beim Ausführen eines Befehls ein neuer Prozess erzeugt (gegabelt). Der Befehl exec erzeugt keinen neuen Prozess. Stattdessen wird der aktuelle Prozess mit dem neuen Befehl überlagert. Mit anderen Worten, der Befehl exec wird anstelle der aktuellen Shell ausgeführt, ohne einen neuen Prozess zu erstellen.

Es gibt drei häufigste Verwendungen des Befehls exec:

1. Ersatz des Prozesses

Beispiel-1: Wenn Sie eine neue bash Shell als öffnen

$ bash 

in pstree sieht es so aus

 ├─gnome-terminal 
 ├─bash───bash───pstree 

Die vorherige bash Shell ist noch vorhanden und Sie haben eine neue bash Shell erhalten. Während, wenn Sie eine neue Bash-Shell als öffnen,

$ exec bash

das pstree zeigt

 ├─gnome-terminal 
 ├─bash───pstree 

Hier wird das alte bash durch ein neues ersetzt. Es ist besonders nützlich, mehrere Anmeldungen mit einem Befehl zu beenden. Es ist sicherer und verhindert, dass versehentlich ein offenes Terminal verlassen wird. Siehe Beenden von root und user mit einem Befehl =

Beispiel 2: Sie können eine Datei öffnen als

$ exec vi filename.txt

Wenn Sie vi beenden, müssen Sie das Terminal nicht separat schließen, da die Shell bereits ersetzt wurde. Sobald Sie das vi schließen, wird auch das Terminal geschlossen.

2. Eine Methode zur Umleitung von Dateideskriptoren innerhalb der Shell-Skripte

Der Befehl exec kann auch in Shell-Skripten zum dynamischen Öffnen, Schließen und Kopieren von Dateideskriptoren verwendet werden. Dies ermöglicht die Umleitung von STDIN, STDERR, STDOUT und anderen Dateideskriptoren in verschiedene Dateien innerhalb des Shell-Skripts anstelle der Befehlsaufrufzeichenfolge. Wenn Sie keinen Befehl oder keine Argumente angeben, können Sie Umleitungssymbole und Dateideskriptoren angeben, um diese Funktionen auszuführen.

Angenommen, Sie haben ein Shell-Skript script.sh Sie möchten eine Protokolldatei script.log haben. Sie können exec als verwenden.

LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1

das ist äquivalent zu

./script &>> /path/to/script.log
./script >>  /path/to/script.log 2>&1

3. Erstellen Sie Phasen des Prozesses mit dem Befehl exec

Sie können auch den Befehl exec verwenden, um eine Reihe von Shell-Skripten zu erstellen, die sich nacheinander wie Phasen des Prozesses ausführen. Anstatt jedes Mal neue Prozesse zu erzeugen, wenn Sie das Steuerelement auf das nächste Skript übertragen müssen, führen Sie den Befehl exec aus.

In diesem Fall sollte die letzte Anweisung jeder Stufe der Befehl exec sein, der die nächste Stufe aufruft.

Weitere Informationen finden Sie unter Verwendung des Befehls exec in Shell-Skripten .

Hinweis: Ein Teil von oben stammt aus this.

8
souravc

Soweit ich weiß, wird es auch verwendet, um Dateideskriptoren (zum Beispiel STDOUT, STDERR, STDIN) eines Bash-Skripts umzuleiten.

So können Sie beispielsweise mit der STDIN-Umleitung von einer Datei auf der Tastatur lesen und mit der STDOUT-Umleitung in eine Datei anstelle des Terminals schreiben (oder, je nach Programm, STDERR).

2
Levin Palm