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 mitRETURNverknüpft ist trap wird ausgeführt, bevor die Ausführung nach der Funktion oder dem Skript fortgesetzt wird. Der Rückgabestatus ist ungleich Null, wennreturnwird 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 .