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 $?
Si second.sh
détecte une erreur et quitte avec le statut -9, first.sh
quitte toujours. Comment puis-je éviter de quitter le premier shell si le shell enfant se termine?
Je ne peux pas modifier second.sh
.
shell
shell-script
exit
user3589887
la source
la source
.
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?Réponses:
Ce que vous faites ici est d'inclure
second.sh
etthird.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 desecond.sh
à ce point. Laexit
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
etthird.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.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.Si vous devez utiliser des variables ou des fonctions définies dans
second.sh
etthird.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'appellentexit
qu'au niveau supérieur, par opposition aux fonctions internes, vous pouvez alors passerexit
àreturn
. Vous pouvez le faire sans modifier le script en utilisant un alias.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.la source
Au lieu de rechercher le deuxième et le troisième shell, exécutez-les comme vous le feriez pour n'importe quelle autre commande. Le code de sortie peut être stocké et utilisé si vous en avez besoin, comme ceci:
la source
STATUS1=$?
capturera le résultat de la commande echo précédemment émise, qui est indépendante du résultat de./second.sh
.Essayez-le de cette façon (supprimez d'abord
.
lors de l'appelsecond.sh
):first.sh
:second.sh
:C'est parce que
.
c'est un shortcode poursource
lequel le deuxième script doit être inclus dans le premier.la source