Exécuter le script Shell après d'autres scripts ont été exécutés avec succès
Énoncé Du Problème:-
J'ai quatre script shell que je veux exécuter uniquement lorsque le script précédent ont été exécutés avec succès. Et je suis en cours d'exécution comme ça actuellement
./verify-export-realtime.sh
sh -x lca_query.sh
sh -x liv_query.sh
sh -x lqu_query.sh
Dans le but de faire d'autres scripts à exécuter après le précédent script a été un succès. J'ai besoin de faire quelque chose comme ci-dessous? Je ne suis pas sûr de savoir si je suis de droite? Si un script a obtenu échoué pour une raison quelconque, il aura l'impression que a Échoué pour une raison quelconque droit?
./verify-export-realtime.sh
RET_VAL_STATUS=$?
echo $RET_VAL_STATUS
if [ $RET_VAL_STATUS -ne 0 ]; then
echo "Failed due to some reason"
exit
fi
sh -x lca_query.sh
RET_VAL_STATUS=$?
echo $RET_VAL_STATUS
if [ $RET_VAL_STATUS -ne 0 ]; then
echo "Failed due to some reason"
exit
fi
sh -x liv_query.sh
RET_VAL_STATUS=$?
echo $RET_VAL_STATUS
if [ $RET_VAL_STATUS -ne 0 ]; then
echo "Failed due to some reason"
exit
fi
sh -x lqu_query.sh
OriginalL'auteur arsenal | 2012-10-15
Vous devez vous connecter pour publier un commentaire.
Le shell fournit un opérateur
&&
de faire exactement cela. Donc, vous pourriez écrire:ou vous pourriez se débarrasser de la ligne de suites (
\
) et de l'écrire sur une seule ligneSi vous voulez savoir dans quelle mesure il a obtenu, vous pouvez ajouter des commandes supplémentaires que juste définir une variable:
La valeur de
$done
à la fin vous indique le nombre de commandes est terminée avec succès.$?
sera assignée à la sortie de la valeur de la dernière commande exécutée (qui est celui qui a échoué), ou0
si tout réussiEn fait, vous pouvez vous débarrasser de la ligne de poursuites et de l'écrire sur 4 lignes. Si la ligne se termine dans
&&
, le shell va continuer la commande sur la ligne suivante sans explicite `\`.Je ne le savais pas. Est-ce le cas dans tous les sh variantes ou tout simplement bash?
C'est du standard. Voir la grammaire pour
and_or
pubs.opengroup.org/onlinepubs/9699919799/utilities/...Je comprends votre réponse. Je travaille également sur le même genre de question que je veux faire, si le premier script échoue ne courez pas en reste et capturer les erreurs du journal.
OriginalL'auteur Chris Dodd
Vous pouvez simplement exécuter une chaîne de scripts en ligne de commande (ou d'un autre script), lors de la première faute de commande briser cette chaîne, à l'aide de "&&" opérateur:
Et ainsi de suite. L'opération permettra de briser une fois l'une des étapes échoue.
C'est pourquoi il y a toutes les commandes "echo". Vous pouvez voir ce qui est imprimé, de sorte que lorsque l'opération brise, vous savez ce qui a échoué, selon ce qui a été imprimé. De toute façon, c'est juste un simple exemple de ce que "&&" peut faire il fait quoi votre script d'origine dans la question ne se, mais plus court. Vous pouvez avoir beaucoup plus compliqué choses écrites. Y
OriginalL'auteur kliteyn
Que devrait être le droit. Vous pouvez également imprimer le code d'erreur, si nécessaire, en se faisant l'écho de la variable$. Vous pouvez également faire votre propre valeur de retour de codes en fait, le retour de vos propres valeurs dans ces scripts et à les vérifier dans ce principale. Il pourrait être plus utile alors "Le script a échoué pour une raison quelconque".
OriginalL'auteur Florin Stingaciu
si vous voulez plus souple de la gestion des erreurs
if script1; then ...
-- pas besoin de stocker$?
si c'est uniquement destiné à être utilisé une fois pour tester si c'est un succès. Aussi, la fin des noms de script avec.sh
est une mauvaise pratique; voir talisman.org/~erlkonig/documents/...Je suis d'accord avec vous.
OriginalL'auteur phani
Le standard de la façon de le faire est de simplement ajouter une option shell qui provoque le script à abandonner si un simple commande échoue. Il suffit d'écrire les interprète ligne:
ou ajouter la commande:
(Il est également fréquent de faire
cmd1 && cmd2 && cmd3
comme mentionné dans d'autres solutions.)Vous absolument ne devrait pas tenter d'imprimer un message d'erreur. La commande doit imprimer une pertinente message d'erreur avant qu'il s'arrête lorsqu'il rencontre une erreur. Si les commandes ne sont pas bien comportés et n'écrivez pas de messages d'erreur utiles, vous devez les corriger plutôt que d'essayer de deviner quelle est l'erreur qu'ils ont rencontrés. Si vous écrivez un message d'erreur, à tout le moins de l'écrire à la bonne place. Les erreurs appartiennent sur stderr:
OriginalL'auteur William Pursell
@William Pursell dit, vos scripts vraiment doivent rendre compte de leurs propres erreurs. Si vous aussi besoin de rapport d'erreur dans le script d'appel, de la façon la plus simple de le faire est comme ceci:
OriginalL'auteur Gordon Davisson