Was Sie hier tun, ist das Einschließen second.shund third.shals Unterskripte, die im selben Prozess ausgeführt werden, der in der Shell-Programmierung als "Sourcing" bezeichnet wird. . ./second.shist im Grunde gleichbedeutend mit dem Einfügen des Textes von second.shan diesem Punkt. Der exitBefehl 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.shund third.shund 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 exitnur 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.shund third.shim übergeordneten Skript definiert sind, müssen Sie diese weiterhin beschaffen.
Das returneingebaute 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 exitan dem Toplevel, wie nach innen Funktionen gegenüber , dann können Sie ändern exitin 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 exites 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.shundthird.shanstatt sie zu beschaffen?