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 POSIX Discussion :

Tester la bonne exécution d'un shell


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut Tester la bonne exécution d'un shell
    Bonjour,

    je dois, dans un script shell A lancer un autre script shell B qui lui même lance un script shell C.

    Comment puis faire pour vérifier que mon shell B s'est exécuté correctement ?
    Est-ce qu'un truc du genre :
    juste après ma commande de lancement du script B fonctionnera et serait suffisant ?

    Et si c'est le script C qui plante ? Cela ne fera pas planter le script B. Donc faut il explicitement mettre un test de réussite sur chacun des script lancé ?

    Merci de votre aide

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bonjour,

    Tout dépend des erreurs des scripts:
    -Il faut que tes scripts sortent avec un code retour différent de zéro en cas d'erreurs (exit num_erreur) et que pour le cas du script C qui sort avec une erreur, il faut que le script qui le lance le gère tout comme une commande banale.
    sinon, n'oublie pas les espaces après '[' et avant ']'

  3. #3
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut
    Donc en substance, et pour résumer, si mon script A lance le script B voici, dans le script B, grosso modo ce que cela devrait donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ma commande shell
    if [ $? -eq 0 ] then exit num_erreur fi
    ma commande shell
    if [ $? -eq 0 ] then exit num_erreur fi
    etc...
    Puis dans mon script A un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ma commande shell
    if [ $? -eq 0 ] then exit num_erreur fi
    ma commande shell
    if [ $? -eq 0 ] then exit num_erreur fi
    etc...
    la même chose quoi.... sauf que dans B le "if" trappe implicitement ses propres erreurs mais qu'avec le exit il sort et passe le code erreur au script qui l'a lancé. Et que implicitement, dans la A, le "IF" récupére ce code et le traite dans le déroulé du A.

    Sui pas sûr d'être clair...

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    A peu près, sauf qu'au lieu de:
    c'est
    Et le problème, c'est que l'on perd vite la valeur de '$?' donc au final cela donnerait plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ma commande shell
    num_erreur=$?
    if [ $num_erreur -ne 0 ] then exit num_erreur fi
    ma commande shell
    num_erreur=$?
    if [ $num_erreur -ne 0 ] then exit num_erreur fi
    etc...
    ou en plus abrégé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ma commande shell
    num_erreur=$?
    [ $num_erreur -ne 0 ] && exit num_erreur
    ma commande shell
    num_erreur=$?
    [ $num_erreur -ne 0 ] && exit num_erreur
    etc...

  5. #5
    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 disedorgue Voir le message

    Et le problème, c'est que l'on perd vite la valeur de '$?'
    C'est pas faux!

    donc au final cela donnerait plutot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ma commande shell
    num_erreur=$?
    if [ $num_erreur -ne 0 ] then exit $num_erreur fi
    ma commande shell
    num_erreur=$?
    if [ $num_erreur -ne 0 ] then exit $num_erreur fi
    etc...
    L'insertion (rapide) d'une ligne de debug peut encore faire perdre le '$?' et, accessoirement, quelques (précieuses) minutes, voire heures de debug. Donc, pour encore plus de précautions, je colle le '$?' au plus près de la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ma commande shell; num_erreur=$?
    if [ $num_erreur -ne 0 ] then exit $num_erreur fi
    ma commande shell; num_erreur=$?
    if [ $num_erreur -ne 0 ] then exit $num_erreur fi
    etc.
    ou en plus abrégé:
    Il existe une version encore plus abrégée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ma commande shell || exit num_erreur
    ma commande shell || exit 1
    etc.
    qui, comme l'usage de base de 'if':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    if ma commande shell 
    then echo ok
    else exit 1
    fi
    if ! ma commande shell # pour les shells qui supportent le bang !
    then exit 1
    fi
    if ma commande shell # pour les shells qui ne supportent pas le bang !
    then :
    else exit 1
    fi
    if ma commande shell ; [ $? -ne 0 ] # pour les shells qui ne supportent pas le bang !
    then exit 1
    fi
    etc.
    a l'avantage d'être compatible avec l'option 'set -e' ou 'set -o errexit' (qui permet de sortir à la première erreur).

  6. #6
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut
    Plusieurs remarques et questions si vous le voulez bien par rapport à ce que vous venez de m'écrire.

    Et le problème, c'est que l'on perd vite la valeur de '$?'...
    Je comprends pas. Comment ça : "perdre" la valeur ?!?

    Ca veut dire quoi
    pour les shells qui supportent le bang !
    Qu'est-ce que cela implique dans mon cas ?

    Par ailleurs, cette syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [ $num_erreur -ne 0 ] && exit num_erreur
    serait donc implicitement équivalente à un Le "&&" signifie "SI l'expression à ma gauche est vraie ALORS j'exécute ce qui est à ma droite".

    Pour terminer, si je comprends bien, la variable num_erreur à laquelle j'affecterai le retour de ma commande shell est une variable que je peux récupérer dans mon script père ?

    Exemple: A lance B qui lance C
    1. J'initialise num_erreur_C dans C
    2. Je récupére et teste num_erreur_C dans B
    3. si il n'y a pas d'erreur j'initialise num_erreur_B dans B
    4. dans A je récupère et teste num_erreur_B
    5. si pas d'erreur, je continue mon script A
    6. si il y a une erreur, je sors.

  7. #7
    Membre éclairé
    Homme Profil pro
    Indépendant spécialiste Cognos/Essbase
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Indépendant spécialiste Cognos/Essbase
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Par défaut
    Merci à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA]Exécuter une commande Shell
    Par antoine46 dans le forum VBA Access
    Réponses: 4
    Dernier message: 16/04/2008, 08h07
  2. Exécuter un script shell via le fichier .mailrc
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 16/06/2007, 18h42
  3. [C]tester l'existance d'une commande shell
    Par waldoun dans le forum Linux
    Réponses: 3
    Dernier message: 07/05/2007, 22h09
  4. expression régulière + excution de commande shell
    Par goanes dans le forum Langage
    Réponses: 3
    Dernier message: 11/10/2006, 13h53
  5. [java.lang.Class & arbre] tester la bonne class
    Par TabrisLeFol dans le forum Langage
    Réponses: 3
    Dernier message: 02/07/2005, 12h48

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