Welche Verwendungsmöglichkeiten gibt es für den Exec-Befehl?

Welche Verwendungsmöglichkeiten gibt es für den Exec-Befehl?

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

Man könnte sagen, sein Zweck besteht darin, eine Rückkehr zu dem Prozess, der ihn ausgelöst hat, unmöglich zu machen.

Aber welche anderen Verwendungsmöglichkeiten gibt es dafür, so etwas execals Befehl zur Verfügung zu haben?

Antwort1

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

Es gibt drei häufigste Verwendungszwecke des Exec-Befehls:

1. Prozessersetzung

Beispiel 1: Wenn Sie eine neue bashShell öffnen als

$ bash 

darin pstreesieht es aus wie

├─Gnome-Terminal
        ├─bash───bash───pstree

Die vorherige bashShell ist noch da und Sie haben eine neue bashShell. Wenn Sie hingegen eine neue Bash-Shell öffnen als,

$ exec bash

Die pstreeShows

├─Gnome-Terminal
        ├─bash───pstree

Hier wird das Alte bashdurch das Neue ersetzt. Dies ist besonders nützlich, um mehrere Anmeldungen mit einem Befehl zu beenden.Es bietet mehr Sicherheit und schließt die Möglichkeit aus, ein Terminal versehentlich offen zu lassen.SehenBeenden Sie sowohl als Root als auch als Benutzer mit einem Befehl

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

$ exec vi filename.txt

Beim Beenden vimuss das Terminal nicht extra geschlossen werden, 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 exec Befehl kann auch in Shellskripten verwendet werden, um Dateideskriptoren dynamisch zu öffnen, zu schließen und zu kopieren. Dadurch können STDIN, STDERR, STDOUT und andere Dateideskriptoren anstelle der Befehlsaufrufzeichenfolge in verschiedene Dateien innerhalb des Shellskripts umgeleitet werden. 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.shfür das Sie eine Protokolldatei benötigen. script.logSie können es wie folgt verwenden exec:

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

Das ist gleichbedeutend mit

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

3. Erstellen von Prozessphasen mit dem Befehl „exec“

Sie können den Befehl exec auch verwenden, um eine Reihe von Shell-Skripten zu erstellen, die einander nacheinander ausführen, wie die einzelnen Phasen eines Prozesses. Anstatt jedes Mal neue Prozesse zu starten, wenn Sie die Kontrolle an das nächste Skript übergeben müssen, führen Sie den Befehl exec aus.

In diesem Fall sollte die letzte Anweisung jeder Phase ein execBefehl sein, der die nächste Phase aufruft.

Sehendie Verwendung des execBefehls in Shell-Skriptenfür mehr.

Notiz:Ein Teil des obigen Textes stammt ausDas.

Antwort2

Im Wrapper-Skript

execwird 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. Das Skript muss zu diesem Zeitpunkt jedoch nicht im Speicher bleiben. Daher execwird in diesen Fällen verwendet, damit das Hauptprogramm das Hauptskript ersetzen kann.

Hier ist ein praktisches Beispiel dafür. Das mate-terminal.wrapperSkript wird mit Mate-Terminal mitgeliefert. Es startet mate-terminalmit einigen zusätzlichen Argumenten, indem es die Umgebung 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);

Beachten Sie hierbei, dass ein execAufruf erfolgt, der dieses Skript im Speicher ersetzt.

Hier ist eine ähnliche Frage, die auf der Unix & Linux StackExchange Site beantwortet wurde -https://unix.stackexchange.com/q/270929/19288

So leiten Sie Dateideskriptoren um

Eine weitere häufige Verwendung von execist die Umleitung von Datei-Deskriptoren. stdin, stdout, stderrkönnen mit exec zu Dateien umgeleitet werden.

  1. Umleitung stdout- exec 1>filebewirkt, dass die Standardausgabe eine Datei ist, die filenach dem Ende der aktuellen Shell-Sitzung benannt ist. Alles, was auf dem Display ausgegeben wird, befindet sich in der Datei.

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

Antwort3

Soweit ich weiß, wird es auch verwendet, um Datei-Deskriptoren (z. B. STDOUT, STDERR, STDIN) eines Bash-Skripts umzuleiten.

So können Sie beispielsweise mithilfe der STDIN-Umleitung aus einer Datei lesen, anstatt sie über die Tastatur zu verwenden, und mithilfe der STDOUT-Umleitung (je nach Programm kann es auch STDERR sein) in eine Datei statt in das Terminal schreiben.

verwandte Informationen