2016-07-27 16 views
0
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

+1

, 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. –

+1

Versuchen Sie '. ./abc', wenn Sie wirklich möchten, dass Ihr Terminal für Sie beendet wird ... – twalberg

Antwort

1

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.

+0

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