web-dev-qa-db-fra.com

Appelez un script pour un autre script, mais ne quittez pas le parent si l'enfant appelle la sortie

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 l'état -9, first.sh sort toujours. Comment puis-je éviter de sortir de la première coquille si la coque de l'enfant sort?

Je ne peux pas éditer second.sh.

11
user3589887

Ce que tu fais ici, c'est y compris second.sh et third.sh En tant que sous-scripts exécutant dans le même processus, appelé "Sourcing" dans la programmation de Shell. . ./second.sh est essentiellement équivalent à inclure le texte de second.sh à ce moment. La commande exit sort du processus, peu importe que vous l'appeliez dans le script d'origine ou dans un script source.

Si tout ce que vous voulez faire, c'est exécuter les commandes dans second.sh et third.sh Et 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 d'enfant.

#! /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 les fonctions à partir du script d'origine, mais ne les modifiez pas, appelez ces scripts dans des sous-vases. Les sous-curseurs sont des processus distincts, alors exit sort seulement eux.

#! /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 alors continuer à les suivre.

Le return _ intégré ne quitte que le script source et non l'ensemble du processus - c'est l'une des rares différences entre l'inclure un autre script avec le . commande et y compris son texte dans le script parent. Si les scripts d'origine n'appellent que exit sur levlevel, par opposition aux fonctions intérieures, vous pouvez modifier exit dans 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é des fonctions intérieures, je ne pense pas qu'il y ait une manière non encombrante. Un moyen lourd est de définir un piège de sortie et de mettre votre code là-bas.

#!/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

Au lieu d'approfondir la deuxième et troisième shell, faites-les simplement comme vous le feriez d'autres commandes. Le code de sortie peut être stocké et utilisé si vous avez besoin, comme vous le souhaitez:

#! /bin/ksh
echo "prova"

# execute and capture stdout ... output of second is not seen ...
OUTPUT1=$(./second.sh)

# find out exit status of second.sh
STATUS1=$?

# ... until now
echo $OUTPUT1

# do something based on the result
if [ $STATUS1 -eq 0 ]; then 
  echo "second.sh ran successfully"
else 
  echo "second.sh crapped out"
fi

# and so on...
6
Dale Anderson

Essayez de cette façon (supprimer le premier . sur appel second.sh):

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 $?

Ceci est dû au fait . est shortcode pour source qui provoque l'inclusion du deuxième script en tant que partie de la première.

0
Mojtaba Rezaeian