Ich verstehe den Bash-Befehl nicht exec
. Ich habe gesehen, dass es in Skripten verwendet wird, um alle Ausgaben in eine Datei umzuleiten (wie in diesem Beispiel gezeigt ). Aber ich verstehe nicht, wie es funktioniert oder was es im Allgemeinen tut. Ich habe die Manpages gelesen, verstehe sie aber nicht.
108
exec
eine spezielle Art und Weise, die viel einfacher erklärt werden kann, ich werde eine Antwort schreiben.Antworten:
man bash
sagt:Die letzten beiden Zeilen sind wichtig: Wenn Sie
exec
ohne Befehl von selbst ausführen , werden die Umleitungen einfach auf die aktuelle Shell angewendet. Sie wissen wahrscheinlich , dass , wenn Sie laufencommand > file
, der Ausgangcommand
geschrieben wird ,file
anstatt zu Ihrem Terminal (das eine genannt wird Umleitung ). Wenn Sieexec > file
stattdessen ausführen , gilt die Umleitung für die gesamte Shell: Jede Ausgabe, die von der Shell erzeugt wird,file
wird auf Ihr Terminal anstatt auf dieses geschrieben . Zum Beispiel hierIch starte zuerst eine neue
bash
Shell. Dann starte ich in dieser neuen Shellexec > file
, damit alle Ausgaben umgeleitet werdenfile
. Zwar laufe ich danachdate
aber ich bekomme keine Ausgabe, weil die Ausgabe umgeleitet wirdfile
. Dann beende ich meine Shell (damit die Umleitung nicht mehr gilt) und sehe, dass siefile
tatsächlich die Ausgabe desdate
zuvor ausgeführten Befehls enthält .quelle
exec
Dient auch dazu, den aktuellen Shell-Prozess durch einen Befehl zu ersetzen, sodass die Eltern einen Weg gehen und das Kind die pid besitzt. Dies dient nicht nur der Umleitung. Bitte fügen Sie diese Information hinzuexec nginx <various nginx arguments>
. Dies bedeutet, dass Nginx die PID des Bash-Skripts übernimmt und jetzt Nginx der Hauptausführungsprozess des Containers ist, nicht das Skript. Ich nehme an, dies dient nur der Sauberkeit, es sei denn, jemand anderes kennt einen konkreteren Grund dafür?gnome-terminal
, das zumindest am 14.04 ein Wrapper-Skript hatte, um Argumente einzurichten. Und das ist ihr einziger Zweck, wirklich - gesetzte Künste und Umwelt. Ein anderer Fall wäre, aufzuräumen - die vorherige Instanz eines Prozesses zuerst zuexec
Beispiel, das demnginx
Beispiel von @LukeGriffiths ähnelt, ist das~/.vnc/xstartup
Skript,vncserver
mit dem ein VNC-Serverprozess konfiguriert wird, und dannexec gnome-session
oderexec startkde
und so weiter.exec
ein Container-Startskript, ist, dass die PID 1, der ENTRYPOINT des Containers, in Docker eine besondere Bedeutung hat. Es ist ein Hauptprozess, der Signale empfängt, und wenn er existiert, verlässt er auch den Container.exec
Nur eine Möglichkeit,sh
diese Befehlskette zu verlassen und den Daemon zum Hauptprozess des Containers zu machen.exec
ist ein Befehl mit zwei sehr unterschiedlichen Verhaltensweisen, je nachdem, ob mindestens ein Argument oder gar kein Argument verwendet wird.Wenn mindestens ein Argument übergeben wird, wird das erste als Befehlsname verwendet und
exec
versucht, es als Befehl auszuführen, indem die verbleibenden Argumente an diesen Befehl übergeben und die Umleitungen, falls vorhanden, verwaltet werden.Wenn der als erstes Argument übergebene Befehl nicht vorhanden ist, wird die aktuelle Shell, nicht nur der Befehl exec, fehlerhaft beendet.
Wenn der Befehl vorhanden und ausführbar ist, ersetzt er die aktuelle Shell. Das bedeutet, dass
exec
die Anweisungen, die auf den exec-Aufruf folgen , niemals ausgeführt werden , wenn sie in einem Skript erscheinen (esexec
sei denn, sie befinden sich selbst in einer Subshell).exec
kehrt nie zurück. Shell-Traps wie "EXIT" werden ebenfalls nicht ausgelöst.Wenn kein Argument übergeben wird,
exec
werden nur die aktuellen Shell-Dateideskriptoren neu definiert. Die Shell wird imexec
Gegensatz zum vorherigen Fall nach dem fortgesetzt , aber die Standardeingabe, die Standardausgabe, der Standardfehler oder der umgeleitete Dateideskriptor werden wirksam.Wenn einige der Umleitungen verwendet werden
/dev/null
, werden alle Eingaben von EOF zurückgegeben und alle Ausgaben verworfen.Sie können Dateideskriptoren schließen, indem Sie
-
als Quelle oder Ziel verwenden, zexec <&-
. Nachfolgende Lese- oder Schreibvorgänge schlagen dann fehl.Hier sind zwei Beispiele:
Dieses Skript gibt "foo" als cat-Befehl aus, anstatt auf Benutzereingaben zu warten, wie dies im Normalfall der Fall gewesen wäre. Die Eingabe erfolgt aus der Datei / tmp / bar, die foo enthält.
Dieses Skript wird angezeigt
4
(die Anzahl der Bytes in / tmp / bar) und endet sofort. Dercat
Befehl wird nicht ausgeführt.quelle
/dev/null
, sodass Schreibvorgänge weiterhin erfolgreich sind und Return-EOF gelesen werden.close(2)
Auf einem fd würden Systemaufrufe mit Lese- / Schreibzugriff Fehler zurückgeben, und Sie tun diesexec 2>&-
beispielsweise mit.exec 3</dev/null;
ls -l /proc/self/fd
:: Beachten Sie, dass fd 3 unter / dev / null schreibgeschützt geöffnet ist. Dann schließe es wieder mitexec 3<&-
, und du siehst (ls -l /proc/$$/fd
wieder mit), dass dein Shell-Prozess kein fd 3 mehr hat. (Das Schließen von stdin mitexec <&-
kann in Skripten nützlich sein, aber interaktiv ist es eine Abmeldung.)exec
der aktuell am häufigsten bewerteten Antwort nur den einen Anwendungsfall und die andere Antwort von g_p nur den anderen Anwendungsfall betreffen. Und diese Antwort ist für solch ein komplexes Thema nett und präzise / lesbar.Um zu verstehen
exec
, müssen Sie zuerst verstehenfork
. Ich versuche es kurz zu halten.Wenn Sie zu einer Weggabelung kommen, haben Sie im Allgemeinen zwei Möglichkeiten. Linux-Programme erreichen diese Weggabelung, wenn sie auf einen
fork()
Systemaufruf stoßen.Normale Programme sind Systembefehle, die in kompilierter Form auf Ihrem System vorhanden sind. Wenn ein solches Programm ausgeführt wird, wird ein neuer Prozess erstellt. Dieser untergeordnete Prozess hat dieselbe Umgebung wie sein übergeordneter Prozess, nur die Prozess-ID unterscheidet sich. Dieser Vorgang wird als Gabeln bezeichnet .
exec
wird verwendet.exec
ersetzt den Inhalt des aktuell ausgeführten Prozesses durch die Informationen aus einer Programm-Binärdatei.quelle
exec
eine Skriptausgabe umgeleitet werden kann, wie in dem von mir geposteten Link?In
bash
, wenn du tusthelp exec
:Das relevante Bit:
exec
ist eine eingebaute Shell , die das Shell-Äquivalent derexec
Familie von Systemaufrufen ist , von denen G_P spricht (und deren Hilfeseiten Sie offenbar gelesen haben). Es hat nur die von POSIX vorgeschriebene Funktionalität, die aktuelle Shell zu beeinflussen, wenn kein Befehl angegeben wird.quelle