Ce que vous faites ici est d'inclure second.sh
et third.sh
de sous-scripts s'exécuter dans le même processus, qui est appelé «sourcing» dans la programmation shell. . ./second.sh
est fondamentalement équivalent à inclure le texte de second.sh
à ce point. La exit
commande quitte le processus, peu importe que vous l'appeliez dans le script d'origine ou dans un script d'origine.
Si tout ce que vous voulez faire est d'exécuter les commandes dans second.sh
et third.sh
qu'ils n'ont pas besoin d'accéder ou de modifier des variables et des fonctions à partir du script d'origine, appelez ces scripts en tant que processus enfants.
#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"
Si vous avez besoin des autres scripts pour accéder aux variables et fonctions à partir du script d'origine, mais pas les modifier, appelez ces scripts en sous-shell. Les sous-coquilles sont des processus distincts, donc exit
ne les quittent que.
#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"
Si vous devez utiliser des variables ou des fonctions définies dans second.sh
et third.sh
dans le script parent, vous devrez continuer à les sourcer.
La commande return
intégrée ne quitte que le script source et non l'ensemble du processus - c'est l'une des rares différences entre l'inclusion d'un autre script avec la .
commande et l'inclusion de son texte dans le script parent. Si les scripts d'origine n'appellent exit
qu'au niveau supérieur, par opposition aux fonctions internes, vous pouvez alors passer exit
à return
. Vous pouvez le faire sans modifier le script en utilisant un alias.
#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"
Si exit
est également appelé à l'intérieur des fonctions, je ne pense pas qu'il existe un moyen non encombrant. Un moyen lourd consiste à définir un piège de sortie et à y mettre votre code.
#!/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
.
commande, qui source un autre fichier dans le shell actuel. Aucun shell enfant ou sous-shell n'est impliqué. Vouliez-vous exécutersecond.sh
etthird.sh
au lieu de les sourcer?