it-swarm.com.de

Wozu dient der Befehl exec in Shell-Skripten?

Kann jemand mit einfachen Beispielen erklären, wozu der Befehl exec in Shell-Skripten verwendet wird?

236
user2400564

Die in exec eingebauten Befehlsspiegel funktionieren im Kernel, es gibt eine Familie von ihnen, die auf execve basiert, was normalerweise von C aufgerufen wird.

exec ersetzt das aktuelle Programm im aktuellen Prozess, ohne fork einen neuen Prozess zu erstellen. Es ist nicht etwas, das Sie in jedem Skript verwenden würden, das Sie schreiben, aber es ist gelegentlich nützlich. Hier sind einige Szenarien, die ich verwendet habe;

  1. Wir möchten, dass der Benutzer ein bestimmtes Anwendungsprogramm ohne Zugriff auf die Shell ausführt. Wir könnten das Anmeldeprogramm in/etc/passwd ändern, aber möglicherweise möchten wir, dass die Umgebungseinstellung von Startdateien verwendet wird. Also, in (say) .profile sagt die letzte Aussage so etwas wie:

     exec appln-program
    

    so, jetzt gibt es keine Shell, zu der man zurückkehren kann. Selbst wenn appln-program abstürzt, kann der Endbenutzer nicht zu einer Shell gelangen, da diese nicht vorhanden ist - die exec hat sie ersetzt.

  2. Wir möchten eine andere Shell als die in/etc/passwd verwenden. So dumm es auch sein mag, auf einigen Websites können Benutzer ihre Anmelde-Shell nicht ändern. Bei einer mir bekannten Site haben alle mit csh begonnen, und alle haben einfach in ihre .login (csh-Startdatei) einen Aufruf an ksh abgelegt. Während das funktionierte, lief ein verirrter csh -Prozess, und das Abmelden war zweistufig, was verwirrend werden konnte. Also haben wir es in exec ksh geändert, das gerade das c-Shell-Programm durch die korn-Shell ersetzt hat, und alles einfacher gemacht (es gibt andere Probleme, wie die Tatsache, dass ksh kein Login ist -Schale).

  3. Nur um Prozesse zu speichern. Wenn wir prog1 -> prog2 -> prog3 -> prog4 usw. aufrufen und niemals zurückgehen, dann machen Sie jeden Aufruf zu einem exec. Dies spart Ressourcen (zugegebenermaßen nicht viel, sofern dies nicht wiederholt wird) und vereinfacht das Herunterfahren.

Sie haben offensichtlich gesehen, dass exec irgendwo verwendet wird, vielleicht könnten wir seine Verwendung rechtfertigen, wenn Sie den Code zeigen, der Sie nervt.

Bearbeiten: Ich habe festgestellt, dass meine Antwort oben unvollständig ist. Es gibt zwei Verwendungen von exec in Shells wie ksh und bash - zum Öffnen von Dateideskriptoren. Hier sind einige Beispiele:

exec 3< thisfile          # open "thisfile" for reading on file descriptor 3
exec 4> thatfile          # open "thatfile" for writing on file descriptor 4
exec 8<> tother           # open "tother" for reading and writing on fd 8
exec 6>> other            # open "other" for appending on file descriptor 6
exec 5<&0                 # copy read file descriptor 0 onto file descriptor 5
exec 7>&4                 # copy write file descriptor 4 onto 7
exec 3<&-                 # close the read file descriptor 3
exec 6>&-                 # close the write file descriptor 6

Beachten Sie, dass der Abstand hier sehr wichtig ist. Wenn Sie ein Leerzeichen zwischen der fd-Nummer und dem Umleitungssymbol einfügen, kehrt exec zur ursprünglichen Bedeutung zurück:

  exec 3 < thisfile       # oops, overwrite the current program with command "3"

Es gibt verschiedene Möglichkeiten, wie Sie diese verwenden können, z. B. bei Verwendung von read -u oder print -u für bash:

read <&3
echo stuff >&4
267
cdarke

Um die akzeptierte Antwort mit einer kurzen, für Neulinge freundlichen Kurzantwort zu ergänzen, benötigen Sie wahrscheinlich exec nicht.

Wenn Sie noch hier sind, sollte die folgende Diskussion hoffentlich zeigen, warum. Wenn Sie laufen, sagen Sie,

sh -c 'command'

sie führen eine sh-Instanz aus und starten dann command als untergeordnetes Element dieser sh-Instanz. Wenn command beendet ist, wird auch die Instanz sh beendet.

sh -c 'exec command'

führt eine sh -Instanz aus. Dann ersetzt diese sh -Instanz durch die command-Binärdatei und führt diese stattdessen aus.

Natürlich sind beide in diesem begrenzten Kontext nutzlos; du willst einfach

command

Es gibt einige Randbedingungen, in denen Sie möchten, dass die Shell ihre Konfigurationsdatei liest oder die Umgebung auf andere Weise als Vorbereitung für die Ausführung von command einrichtet. Dies ist so ziemlich die einzige Situation, in der exec command nützlich ist.

#!/bin/sh
ENVIRONMENT=$(some complex task)
exec command

Hiermit bereiten Sie die Umgebung so vor, dass sie das enthält, was benötigt wird. Sobald dies erledigt ist, ist die Instanz sh nicht mehr erforderlich. Daher ist es eine (geringfügige) Optimierung, die Instanz sh einfach durch den Prozess command zu ersetzen, anstatt ihn sh als untergeordneten Prozess ausführen zu lassen und darauf zu warten wie es endet.

Wenn Sie am Ende eines Shell-Skripts so viele Ressourcen wie möglich für einen schwerfälligen Befehl freigeben möchten, können Sie diesen Befehl als Optimierung exec verwenden.

Wenn etwas Sie zwingt, sh auszuführen, Sie aber wirklich etwas anderes ausführen möchten, ist exec something else natürlich eine Problemumgehung, um die unerwünschte sh -Instanz zu ersetzen (wie zum Beispiel, wenn Sie wirklich Ihre eigene schicke gosh anstelle von sh ausführen möchten) Ihr Konto ist nicht in /etc/shells aufgeführt, daher können Sie es nicht als Anmeldeshell angeben.

Die zweite Verwendung von exec zum Bearbeiten von Dateideskriptoren ist ein separates Thema. Die akzeptierte Antwort deckt das gut ab; Um dies in sich geschlossen zu halten, werde ich mich einfach auf das Handbuch für alles beschränken, auf das exec eine Umleitung anstelle eines Befehlsnamens folgt.

39
tripleee