Ja; Sie können return
verwenden statt exit
. Sein Hauptzweck ist die Rückkehr von einer Shell-Funktion, aber wenn Sie es innerhalb eines source
verwenden -d Skript, es kehrt von diesem Skript zurück.
Wie §4.1 "Bourne Shell Builtins" des Bash Reference Manual sagt es:
return [n]
Beenden Sie eine Shell-Funktion mit dem Rückgabewert n .Wenn n nicht geliefert wird, ist der Rückgabewert der Exit-Status des zuletzt in der Funktion ausgeführten Befehls. Dies kann auch verwendet werden, um die Ausführung eines Skripts zu beenden, das mit
.
ausgeführt wird (odersource
) eingebaut und gibt entweder n zurück oder der Exit-Status des letzten im Skript ausgeführten Befehls als Exit-Status des Skripts. Jeder Befehl, der mitRETURN
verknüpft ist trap wird ausgeführt, bevor die Ausführung nach der Funktion oder dem Skript fortgesetzt wird. Der Rückgabestatus ist ungleich Null, wennreturn
wird außerhalb einer Funktion und nicht während der Ausführung eines Skripts von.
verwendet odersource
.
Anstatt das Skript mit . run2.sh
auszuführen , können Sie es mit sh run2.sh
ausführen oder bash run2.sh
Eine neue Sub-Shell wird gestartet, um das Skript dann auszuführen, wird sie am Ende des Skripts geschlossen, wobei die andere Shell geöffnet bleibt.
Das "Problem" ist wirklich, dass Sie das Skript beschaffen und nicht ausführen. Wenn Sie eine Datei als Quelle verwenden, wird ihr Inhalt in der aktuellen Shell ausgeführt, anstatt eine Subshell zu erzeugen. Also wirkt sich alles, einschließlich Exit, auf die aktuelle Shell aus.
Anstatt exit
zu verwenden , verwenden Sie return
.
Sie können nach der return-Anweisung/dem return-Befehl einen zusätzlichen Exit-Befehl hinzufügen, sodass er sowohl für die Ausführung des Skripts von der Befehlszeile als auch für die Quellenangabe vom Terminal funktioniert.
Beispiel-Exit-Code im Skript:
if [ $# -lt 2 ]; then
echo "Needs at least two arguments"
return 1 2>/dev/null
exit 1
fi
Die Zeile mit dem exit
Der Befehl wird nicht aufgerufen, wenn Sie das Skript nach dem return
ausgeben Befehl.
Wenn Sie das Skript ausführen, return
Befehl gibt einen Fehler aus. Also unterdrücken wir die Fehlermeldung, indem wir sie an /dev/null
weiterleiten .