date
ls
exit
Auf Ausführung dieses Skripts ausgeführt zu werden, die Befehle date
und ls
ausgeführt, aber das Terminal wird nicht geschlossen. Warum?Ausgang nicht im Skript
date
ls
exit
Auf Ausführung dieses Skripts ausgeführt zu werden, die Befehle date
und ls
ausgeführt, aber das Terminal wird nicht geschlossen. Warum?Ausgang nicht im Skript
Das Skript wird nur die Shell beenden, in der es ausgeführt wird. Wenn Sie ./abc
tun, dann überschreibt Parent Shell eine Subshell, in der ./abc
ausgeführt wird. Nur um etwas offensichtlich über Subshell Ausfahrt, betrachten Sie das folgende Beispiel:
#!/bin/bash
echo hi
(exit)
echo hello
druckt sowohl hi
und hello
. Die 10 passiert in der Unterschale. Daher wird das Skript nicht beendet und daher wird die letzte echo hello
ausgeführt.
Um zu sehen, dass das Skript selbst, versuchen Sie verlässt
#!/bin/bash
echo hi
exit
echo hello
dieses Skript ausführen, werden Ausgang nur „hallo“; Der Befehl exit beendet das Skript (aber nicht die Shell, die in Ihrem Terminal ausgeführt wird), bevor es echo hello
erreicht.
Hilfreich, aber beachten Sie, dass ein (nicht ausgelagertes) Skript _not_ a _subshell_ ist, aber _ein Kindprozess, der zufällig eine andere Shell-Instanz ausführt_ (Die spezifische Shell/ausführbare Datei wird durch die Shebang-Zeile des Skripts oder deren Abwesenheit bestimmt und kann insgesamt eine andere Shell sein. Diese Unterscheidung ist wichtig, weil eine echte Subshell (wie in Ihrem '(exit)' Beispiel) eine Kopie der aktuellen Shell-Umgebung hat (erbt alle Variablen, Aliase, Funktionen, ...), was für eine Shell nicht zutrifft Instanz zum Ausführen eines Skripts. – mklement0
, weil das Skript in einer eigenen Subshell ausgeführt wird. Sie haben diese Sub-Shell verlassen, nicht die Parent-Shell, die das Skript ausgeführt hat. –
Versuchen Sie '. ./abc', wenn Sie wirklich möchten, dass Ihr Terminal für Sie beendet wird ... – twalberg