Der "[email protected]"
bit wird auf die Liste der Positionsparameter (normalerweise die Kommandozeilenargumente) erweitert, die einzeln in Anführungszeichen gesetzt werden, um Wortaufteilung und Dateinamengenerierung ("Globbing") zu vermeiden.
Die exec
ersetzt den aktuellen Prozess durch den Prozess, der aus der Ausführung seines Arguments resultiert.
Kurz gesagt, exec "[email protected]"
führt den durch die Kommandozeilenparameter gegebenen Befehl so aus, dass der aktuelle Prozess durch ihn ersetzt wird (wenn die exec
überhaupt in der Lage ist, den Befehl auszuführen).
Zwei weitere Antworten erklären, was exec "[email protected]"
ist tut. Diese Antwort auf Stack Overflow erklärt, warum es für Docker wichtig ist, und wie Sie vermuten, hat es mit Signalen zu tun:
Dies ist in Docker wichtig, damit Signale korrekt weitergeleitet werden. Zum Beispiel, wenn Redis ohne exec
gestartet wurde , erhält es keinen SIGTERM
auf docker stop
und wird keine Chance bekommen, sauber herunterzufahren. In einigen Fällen kann dies zu Datenverlust oder Zombie-Prozessen führen.
Wenn Sie untergeordnete Prozesse starten (d. h. nicht exec
), wird der übergeordnete Prozess für die angemessene Verarbeitung und Weiterleitung von Signalen verantwortlich. Dies ist einer der Gründe, warum es am besten ist, supervisord
zu verwenden oder ähnliches, wenn mehrere Prozesse in einem Container ausgeführt werden, da die Signale entsprechend weitergeleitet werden.
"[email protected]"
in Bourne-ähnlichen Shells wird in Listenkontexten auf alle Positionsparameter als separate Argumente erweitert.
In einem Skript sind die Positionsparameter anfänglich die Argumente, die das Skript selbst empfangen hat.
exec
besteht darin, einen Befehl im selben Prozess wie die Shell auszuführen. Das ist der letzte Befehl, den ein Skript ausführt, da der Prozess danach einen anderen Befehl als die Shell ausführt.
Also, wenn Ihr Skript ist
#! /bin/sh -
exec "[email protected]"
Und Sie rufen Ihr Skript über eine Shell-Befehlszeile auf wie:
/path/to/your-script 'echo' "some test" 'x y'
Es wird exec
aufgerufen mit echo
, some test
, und x y
als Argumente, die echo
ausführen (in den meisten sh
Implementierungen, /bin/echo
im Gegensatz zu echo
Shell builtin) im selben Prozess, der zuvor die Shell ausgeführt hat, die Ihr Skript mit some test
interpretiert und x y
als Argumente.