Wird die ausführbare Datei in der aktuellen Shell oder Unter-Shell „ausgeführt“?

Wird die ausführbare Datei in der aktuellen Shell oder Unter-Shell „ausgeführt“?

Ich führe eine einfache ausführbare Datei aus, die helloin Bash aufgerufen wird. Sie fragt einen Benutzer nach Eingaben und druckt eine Antwort aus. Ich führe sie folgendermaßen aus ./hello.

Sowohl die Eingabeaufforderung als auch die Eingabe der Antwort durch den Benutzer erfolgt in der aktuellen Shell, aber ich dachte, es sollte in einer anderen Shell ausgeführt werden. Ich nahm das an, weil Sie die Quelle verwenden können, um die EXE in der aktuellen Shell auszuführen.

Kann mir jemand erklären, wie das funktioniert?

Bei meinen Recherchen bin ich häufig auf die Begriffe „Shell-Umgebung“ und „Shell-Kontext“ gestoßen. Sind das die gleichen Begriffe?

Antwort1

Sie können „Shell-Umgebung“ über die Umgebung der aktuellen Shell sagen, die die aktuellen Umgebungsvariablen enthält. Die Umgebung wird von jedem gestarteten Unterprozess (Subshell oder anderweitig) übernommen.

Der Begriff „Shell-Kontext“ wird nicht häufig verwendet, aber ich nehme an, dass er dem „Prozesskontext“ entspricht. Im Fall eines Shell-Skripts umfasst dies die Shell-Umgebung sowie die aktuellen Shell-Variablen, Dateideskriptoren (Standardeingabe, Standardausgabe und Standardfehler sowie alle anderen, die explizit geöffnet werden), Signalhandler (installiert mit trap) usw. Wenn es sich um ein C-Programm handeln würde, würde der Prozesskontext bei einem Aufruf von übernommen fork(), aber nicht bei einem nachfolgenden exec()Aufruf (nur die Umgebung würde einen Aufruf von überstehen exec()).

Wenn Sie Ihr helloProgramm ausführen (ich gehe davon aus, dass es sich um ein Shell-Skript handelt), erfolgen die Ein- und Ausgabe im Kontext der Shell, die das helloSkript ausführt. Dies ist „die aktuelle Shell“. Die Shell, in die Sie eingegeben haben, ./helloist die übergeordnete Shell und helloerbt deren Umgebung.

Intern führt die übergeordnete Shell einen fork()-Aufruf aus exec(), um die Shell zu starten, die schließlich das Skript ausführt hello.

Die Tatsache, dass das helloSkript in derselbenTerminalda der Ort, an dem Sie das Skript gestartet haben, lediglich bedeutet, dass die Shell, die das Skript ausführt, dort der aktuelle Vordergrundprozess ist. Die übergeordnete Shell wartet darauf, dass das Skript beendet wird. Wenn es beendet ist, ist die übergeordnete Shell wieder der Vordergrundprozess im Terminal.

Wenn Sie das Skript mit source ./hellooder starten . ./hello, wird es im selben Kontext ausgeführt wie die Shell, in die Sie den Befehl eingegeben haben. Das bedeutet, dass es den Kontext und die Umgebung der interaktiven Shell ändern kann. Beispielsweise kann es das aktuelle Arbeitsverzeichnis ändern (ändert die Umgebung) oder einen Signalhandler installieren (ändert den Kontext) und diese Änderungen wären noch „aktiv“, wenn das Skript fertig ausgeführt wird.

Wenn das helloProgramm eine kompilierte Binärdatei ist, übernimmt es die Umgebung der aufrufenden Shell, teilt aber nicht deren Kontext (Dateideskriptoren usw.). Es wird nicht wirklich in einer Subshell ausgeführt, da es kein Shell-Skript ist. Die übergeordnete Shell wird in den Hintergrund verschoben und wartet auf die Beendigung des Programms, genau wie bei einem Shell-Skript. Aus der Sicht der übergeordneten Shell gibt es keinen Unterschied zwischen dem Starten einer kompilierten Binärdatei oder eines Shell-Skripts.

sourceEine kompilierte Binärdatei darf nicht mit oder (Punkt) begonnen werden, .da die Shell nicht weiß, wie eine Binärdatei zu interpretieren ist.


Diese Antwort ist ein wenig vage, aber ich glaube, sie ist grundsätzlich richtig. Bitte hinterlassen Sie einen Kommentar (oder bearbeiten Sie ihn), wenn etwas korrigiert oder hinzugefügt werden muss.

verwandte Informationen