Wenn ich einen exit
Befehl in einem Shell-Skript verwende, beendet das Skript das Terminal (die Eingabeaufforderung). Gibt es eine Möglichkeit, ein Skript zu beenden und dann im Terminal zu bleiben?
Es run.sh
wird erwartet, dass mein Skript ausgeführt wird, indem es direkt oder von einem anderen Skript bezogen wird.
EDIT: Genauer gesagt gibt es zwei Skripte run2.sh
als
...
. run.sh
echo "place A"
...
und run.sh
als
...
exit
...
Wenn ich es vorbeifahre . run2.sh
und wenn es die exit
Codeline erreicht run.sh
, möchte ich, dass es am Terminal anhält und dort bleibt. Bei Verwendung exit
wird jedoch das gesamte Terminal geschlossen.
PS: Ich habe versucht zu verwenden return
, aber echo
Codeline wird immer noch ausgeführt ...
exit 0
das Skript nach Erfolg beenden, wenn Sie Ihr Skript ausführen, z. B.:./test.sh
Sie sollten die Ausgabe sehen, aber Ihre Konsole bleibt geöffnet.shell
Befehl verwenden, der tatsächlich ein Shell-Terminal öffnet. Meine eigene Erfahrung ist jedoch, dass dies nicht mit passiertexit
. Beim Beenden wird das Steuerelement normalerweise an das übergeordnete Skript zurückgegeben.Antworten:
Das "Problem" ist wirklich, dass Sie das Skript beschaffen und nicht ausführen. Wenn Sie eine Datei als Quelle verwenden, wird deren Inhalt in der aktuellen Shell ausgeführt, anstatt eine Subshell zu erzeugen. Alles, einschließlich Exit, wirkt sich also auf die aktuelle Shell aus.
Anstatt zu verwenden
exit
, möchten Sie verwendenreturn
.quelle
runs.sh
@ruakh verarbeitet wird, hat die bessere Antwort auf diese Frage.sh <script>
oderbash <script>
wenn man ein Skript ausführen und irgendwann beenden möchteJa; Sie können
return
anstelle von verwendenexit
. Sein Hauptzweck ist die Rückkehr von einer Shell-Funktion, aber wenn Sie sie innerhalb von a verwendensource
-d-Skript verwenden, wird sie von diesem Skript zurückgegeben.In §4.1 "Bourne Shell Builtins" des Bash-Referenzhandbuchs heißt es:
quelle
return
kann NUR von einer Funktion verwendet werden. Wenn Siereturn
es als Shell-Skript verwenden und ausführen (z. B.sh run.sh
), meldet bash einen Fehler -return: can only
Rückgabe 'von einer Funktion oder einem Sourcing-Skript'return
nicht funktioniert, wenn das Skript als Shell-Skript ausgeführt und nicht von ausgeführt wird. (odersource
). Übrigens, wo finde ich das Dokumentsource -d
?Anstatt das Skript mit
. run2.sh
auszuführen, können Sie es auch mitsh run2.sh
oder ausführenbash run2.sh
Eine neue Sub-Shell wird gestartet. Um das Skript auszuführen, wird sie am Ende des Skripts geschlossen, wobei die andere Shell geöffnet bleibt.
quelle
sh "." run2.sh
?Sie können nach der return-Anweisung / dem Befehl einen zusätzlichen Exit-Befehl hinzufügen, damit er für beide funktioniert, indem das Skript über die Befehlszeile ausgeführt und über das Terminal bezogen wird.
Beispiel für einen Exit-Code im Skript:
Die Zeile mit dem
exit
Befehl wird nicht aufgerufen, wenn Sie das Skript nach demreturn
Befehl .Wenn Sie das Skript ausführen,
return
gibt der Befehl einen Fehler aus. Daher unterdrücken wir die Fehlermeldung, indem wir sie an weiterleiten/dev/null
.quelle
Eigentlich denke ich, dass Sie verwirrt sein könnten, wie Sie shoult
run a script
.Wenn Sie beispielsweise
sh
ein Skript ausführensh ./run2.sh
, auch wenn das eingebettete Skript mit endetexit
bleibt Ihr Terminalfenster .Wenn Sie jedoch
.
oder verwendensource
, wird Ihr Terminalfenster auch beendet / geschlossen, wenn der Index endet.Weitere Informationen finden Sie unter Was ist der Unterschied zwischen
sh
undsource
?quelle
Dies ist genau so, als würden Sie eine Ausführungsfunktion in Ihr Skript run2.sh einfügen. Sie verwenden den Exit-Code in run, während Sie Ihre run2.sh-Datei in der bash tty als Quelle verwenden. Wenn die Funktion "run" ausgeführt wird, um das Skript zu beenden, und "run2.sh" zum Beenden des Terminators. Dann hat die Run-Funktion die Möglichkeit, Ihren Teminator zu verlassen.
Wie auch immer, ich stimme Kaz zu, es ist ein Designproblem.
quelle
Ich hatte das gleiche Problem und aus den obigen Antworten und aus dem, was ich verstand, was letztendlich für mich funktionierte, war:
Haben Sie eine Shebang-Zeile, die das beabsichtigte Skript aufruft, zum Beispiel:
#!/bin/bash
wird verwendetbash
, um das Skript auszuführenIch habe Skripte mit beiden Arten von Shebang. Aus diesem Grund war die Verwendung von
sh
oder.
nicht zuverlässig, da dies zu einer Fehlausführung führte (z. B. wenn das Skript unvollständig ausgeführt wird).Die Antwort war daher
(chmod +x file.sh)
Rufen Sie es direkt ohne
sh
oder auf.
(./myscript.sh)
Hoffe das hilft jemandem mit ähnlichen Fragen oder Problemen.
quelle
Ich denke, dass dies passiert, weil Sie es im Quellmodus mit dem Punkt ausführen
Sie sollten das in einer Subshell ausführen:
'source' http://ss64.com/bash/source.html
quelle
. myscript.sh
funktioniert. Möglicherweise benötigen Sie höchstens./myscript.sh
.Es ist richtig, dass Sourcing- oder ausgeführte Skripte
return
vs. verwendenexit
, um dieselbe Sitzung offen zu halten, wie andere angemerkt haben.Hier ist ein verwandter Tipp, wenn Sie jemals ein Skript möchten, das die Sitzung offen hält, unabhängig davon, ob es aus einer Quelle stammt oder nicht.
Das folgende Beispiel kann direkt wie /
foo.sh
oder wie. foo.sh
/ ausgeführt werdensource foo.sh
. In beiden Fällen bleibt die Sitzung nach dem "Beenden" geöffnet. Die$@
Zeichenfolge wird übergeben, damit die Funktion auf die Argumente des äußeren Skripts zugreifen kann.Endergebnis:
Dies kann nützlich sein, um Skriptänderungen in einem einzelnen Terminal schnell zu testen, während eine Menge Schrottcode unter dem Haupt-
exit
/return
während der Arbeit bleibt. Es könnte Code in gewisser Weise auch portabler machen (wenn Sie Tonnen von Skripten haben, die möglicherweise auf unterschiedliche Weise aufgerufen werden oder nicht), obwohl es viel weniger umständlich ist, sie nur zu verwendenreturn
undexit
gegebenenfalls.quelle
Wenn Ihr Terminalemulator nicht über
-hold
ein Skript verfügt, können Sie ein Sourcing-Skript bereinigen und das Terminal mit folgenden Funktionen halten:sonst kannst du verwenden
$TERM -hold -e script
quelle
Stellen Sie außerdem sicher, dass Sie mit dem erwarteten Rückgabewert zurückkehren. Wenn Sie exit verwenden, wenn Sie auf ein Exit stoßen, wird es aus Ihrer Basis-Shell beendet, da die Quelle keinen anderen Prozess (keine Instanz) erstellt.
quelle
Um ein Skript zu schreiben , das sicher ist , ausgeführt werden entweder als ein Shell - Skript oder als RC - Datei stammen, kann das Skript überprüfen und vergleichen ,
$0
und ,$BASH_SOURCE
und festzustellen , obexit
sicher verwendet werden kann.Hier ist ein kurzer Code-Ausschnitt dafür
quelle
1) exit 0 wird aus dem Skript entfernt, wenn es erfolgreich ist.
2) Exit 1 wird aus dem Skript entfernt, wenn es ein Fehler ist.
Sie können diese beiden oben genannten basierend auf ur req versuchen.
quelle