first.sh
::
#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"
second.sh
::
echo "sono nel secondo script"
dosomething1
exit $?
Wenn second.sh
ein Fehler erkannt wird und mit dem Status -9 beendet wird, wird first.sh
immer beendet. Wie kann ich vermeiden, die erste Shell zu verlassen, wenn die untergeordnete Shell beendet wird?
Ich kann nicht bearbeiten second.sh
.
shell
shell-script
exit
user3589887
quelle
quelle
.
Befehl, der eine andere Datei in der aktuellen Shell bezieht. Es ist keine untergeordnete Shell oder Subshell beteiligt. Wollten Sie sie ausführensecond.sh
undthird.sh
anstatt sie zu beschaffen?Antworten:
Was Sie hier tun, ist das Einschließen
second.sh
undthird.sh
als Unterskripte, die im selben Prozess ausgeführt werden, der in der Shell-Programmierung als "Sourcing" bezeichnet wird.. ./second.sh
ist im Grunde gleichbedeutend mit dem Einfügen des Textes vonsecond.sh
an diesem Punkt. Derexit
Befehl beendet den Prozess. Es spielt keine Rolle, ob Sie ihn im ursprünglichen Skript oder in einem Quellenskript aufrufen.Wenn alles , was Sie tun möchten , ist die Befehle läuft in
second.sh
undthird.sh
und sie nicht dem Zugriff auf oder ändern Variablen und Funktionen von dem Original - Skript benötigen, diese Skripte als Kindprozesse nennen.Wenn Sie die anderen Skripte benötigen, um über das ursprüngliche Skript auf Variablen und Funktionen zuzugreifen, diese jedoch nicht zu ändern, rufen Sie diese Skripte in Subshells auf. Unterschalen sind separate Prozesse, daher werden
exit
nur sie beendet.Wenn Sie Variablen oder Funktionen verwenden müssen, die im
second.sh
undthird.sh
im übergeordneten Skript definiert sind, müssen Sie diese weiterhin beschaffen.Das
return
eingebaute Skript beendet nur das Sourcing-Skript und nicht den gesamten Prozess. Dies ist einer der wenigen Unterschiede zwischen dem Einfügen eines anderen Skripts in den.
Befehl und dem Einfügen seines Texts in das übergeordnete Skript. Wenn die sourced Skripte nur ruftexit
an dem Toplevel, wie nach innen Funktionen gegenüber , dann können Sie ändernexit
inreturn
. Sie können dies tun, ohne das Skript mithilfe eines Alias zu ändern.Wenn
exit
es auch innerhalb von Funktionen genannt wird, glaube ich nicht, dass es einen nicht umständlichen Weg gibt. Eine umständliche Möglichkeit besteht darin, eine Ausgangsfalle einzurichten und Ihren Code dort abzulegen.quelle
Anstatt die zweite und dritte Shell zu beziehen, führen Sie sie einfach wie jeden anderen Befehl aus. Der Exit-Code kann gespeichert und bei Bedarf verwendet werden:
quelle
STATUS1=$?
fängt das Ergebnis eines zuvor ausgegebenen Echo-Befehls ab, der unabhängig vom Ergebnis von ist./second.sh
.Versuchen Sie es so (zuerst
.
beim Anruf entfernensecond.sh
):first.sh
::second.sh
::Dies liegt daran, dass
.
es sich um einen Shortcode handelt, fürsource
den das zweite Skript als Teil des ersten Skripts aufgenommen wird.quelle