IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Exit de tous les scripts imbriqués


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut Exit de tous les scripts imbriqués
    Bonjour à tous !
    J'aurais besoin de vos lumières concernant un moyen de quitter plusieurs scripts d'un coup.
    En effet, j'ai conçu des scripts qui s'appellent les uns les autres, ce qui provoque un hiérarchie à 3 niveaux :
    Script père -> Scripts fils -> Scripts "petit-fils"

    Le problème est que si une commande s'exécute mal dans un des scripts de niveau 3, un simple exit ferme uniquement ce script là et l'exécution se poursuit au niveau 2.

    Est-il du coup possible via un exit (ou une autre commande) de quitter l'ensemble du processus, peu importe le niveau dans lequel on se trouve ?

    PS : J'ai testé "set -e" mais cette commande est contraignante car au moindre grep vide, tout s'arrête...

    Merci d'avance

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Bonjour,

    exit accepte un argument, qui, si il est supérieur à zéro, indique une erreur.
    Peut-il suffire de tester le code de retour d'un script, et de le remonter jusqu'au script père qui lui-même retournera ce code ?

    très grossièrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ./script_père
     
    ./script_fils
    retVal=$?
    test $retVal -gt 0 && exit $retVal
    #dans script_fils
    ./script_petit_fils || exit $?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Il te faut sourcer tes scripts (fils et petit-fils) et non les appeler, de ce fait la commande exit arrêtera l'ensemble.

    Par contre attention aux variables déclarées, avec le sourçage elle deviennent communes à l'ensemble des scripts...

  4. #4
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Merci de vos réponses !
    zipe31 : Je viens de tester ta solution avec 2 petits scripts, ça marche nickel. Par contre, ce problème de variables communes est vraiment dérangeant pour moi car ça va me prendre énooooooooooooooormément de temps de tout modifier. J'ai fait l'erreur d'appeler mes variables de manière identique d'un script à l'autre...
    N_BaH : Je ne suis pas sûr de comprendre tout à fait ta réponse, mais elle implique également que je source mes scripts j'ai l'impression...

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 635
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    elle implique également que je source mes scripts j'ai l'impression...
    non.

    Code pEre : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
     
    ./fils || exit $?
    Code fils : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
     
    ./petiFils || exit $?
    Code petiFils : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
     
    grmblh 2>/dev/null || exit 3
    donc, erreur!
    erreur qui est remontée par les exit depuis le petiFils.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Ah d'accord je vois mieux. Autant pour moi.
    Merci beaucoup, je vais voir ce que ça donne

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Il te faut sourcer tes scripts (fils et petit-fils) et non les appeler, de ce fait la commande exit arrêtera l'ensemble.

    Par contre attention aux variables déclarées, avec le sourçage elle deviennent communes à l'ensemble des scripts...
    Il me semble que le choix de sourcer ou appeler un script devrait être dicté par d'autres considérations que la sortie générale!

    Ici, on développe un framework en ksh qui comporte environ 600 fonctions.

    Notre choix d'architecture a été de les répartir dans différents modules.
    Un script écrit par un de nos clients doit commencer par sourcer notre module chapeau qui source les autres modules (plus ou moins optionnels), ce qui leur permet d'utiliser nos fonctions dans la suite de leur script.
    L'alternative aurait été d'écrire des scripts indépendants, mais c'est plus coûteux (chaque appel fait un fork) et, surtout, ça aurait complexifié considérablement le stockage d'informations (certaines de nos fonctions calculent des valeurs qui sont stockées dans des variables globales privées, utilisées ensuite par d'autres fonctions).

    Ici, c'est plutôt la rémanence d'informations et la gestion des logs avec log4sh qui a dicté notre choix de sourcer les modules.

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Il me semble que le choix de sourcer ou appeler un script devrait être dicté par d'autres considérations que la sortie générale!.
    Je ne faisais que donner une solution parmi d'autres.
    Après, les tenants et aboutissants, vu le peu d'information qu'il est donné systématiquement, ne rentrent pas en jeu, d'autant plus que j'ai bien prévenu d'une des incidences possible

    Merci quand même d'avoir souligné ce point fort intéressant s'il en est

  9. #9
    Membre averti
    Inscrit en
    Mars 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 19
    Par défaut
    Après de longues heures à tout remanier, la méthode de N_BaH fonctionne à merveille. C'est là que je me dis qu'il est bon de penser à toutes les problématiques avant de se jeter dans le script...
    En tous les cas, merci beaucoup !!!

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par ned57 Voir le message
    PS : J'ai testé "set -e" mais cette commande est contraignante car au moindre grep vide, tout s'arrête...
    C'est effectivement très contraignant! Mais bien pratique pour blinder le code!

    Il faut à chaque fois tester le code retour (soit avec if until while || &&) ou inverser avec '!' (si le shell le supporte!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    set -e
    ! echo coucou | grep coco
    if ! echo coucou | grep coco ; then echo 'pas trouvé' ; fi
    echo coucou | grep coco || echo 'pas trouvé'
    echo coucou | grep coco && echo 'trouvé'
    echo coucou | grep coucou && echo 'trouvé'
    echo coucou | grep coco || true
    echo coucou | grep coco || :
    A=$(echo coucou | grep coco) || :
    echo "'$A'"
    Si le script est un peu long, il vaut mieux s'en être occupé dès le début!

Discussions similaires

  1. [2010 DB Project] Comment executer tous les scripts
    Par CUCARACHA dans le forum Visual Studio
    Réponses: 0
    Dernier message: 11/10/2010, 12h18
  2. Arreter tous les scripts en cours
    Par Fabthebug dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/07/2009, 10h39
  3. Réponses: 8
    Dernier message: 26/11/2007, 15h01
  4. Générer tous les scripts de création de tables
    Par farenheiit dans le forum Administration
    Réponses: 5
    Dernier message: 03/08/2007, 11h05
  5. [Forum] Des erreurs avec tous les scripts PHP
    Par sensoo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 25/04/2006, 18h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo