Was Sie hier tun, ist das Einschließen second.sh
und third.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 von second.sh
an diesem Punkt. Der exit
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
und third.sh
und sie nicht dem Zugriff auf oder ändern Variablen und Funktionen von dem Original - Skript benötigen, diese Skripte als Kindprozesse nennen.
#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
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.
#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
Wenn Sie Variablen oder Funktionen verwenden müssen, die im second.sh
und third.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 ruft exit
an dem Toplevel, wie nach innen Funktionen gegenüber , dann können Sie ändern exit
in return
. Sie können dies tun, ohne das Skript mithilfe eines Alias zu ändern.
#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"
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.
#!/bin/ksh
do_first () {
echo "prova"
trap "after_second" EXIT
. ./second.sh
after_second
}
after_second () {
echo "ho lanciato il secondo"
trap "after_third" EXIT
. ./third.sh
after_third
}
after_third () {
trap - EXIT
echo "ho lanciato il terzo"
}
do_first
.
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?