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

Linux Discussion :

Exit code d'une commande pipée


Sujet :

Linux

  1. #1
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut Exit code d'une commande pipée
    Bonjour,

    Savez comment on peut récupérer le code de retour (exit code) d'une commande pipée ? Par exemple :

    Comment récupérer le code de retour de commande1 ?

    Indice : j'ai la main sur commande2 qui est un script shell si besoin est.

    Merci

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Utilise la variable $?

  3. #3
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Gros malin : tu penses bien que j'ai essayé !!!! Fais le test toi-même :

    script.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/ksh
    echo "toto"
    exit 1
    Lance ce qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./script.sh | cat ; echo $?
    Tu obtiens toujours 0, qui est le code de retour de cat.

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    T'excite pas, je pouvais pas le deviner moi

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Je n'ai pas de réponse, mais ça s'annonce mal :
    Citation Envoyé par man bash
    [...]The return status of a pipeline is the exit status of the last command, unless the pipefail option is enabled. If pipefail is enabled, the pipeline's return status is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands exit successfully. If the reserved word ! precedes a pipeline, the exit status of that pipeline is the logical negation of the exit status as described above. The shell waits for all commands in the pipeline to terminate before returning a value.[...]
    Tu auras beau contrôler la deuxième commande, son seul lien (de son point de vue) avec la première sera son entrée standard (la sortie de la première)...et le code de retour ne passe pas par là...
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  6. #6
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    J'en ai bien peur aussi, mais je cherche une éventuelle solution de contournement.

    "pipefail" : c'est quoi, ce truc ? Parce qu'a priori, c'est ce que je cherche. Sais-tu si ça existe avec ksh ?

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    tu as pas de solution de contournement , tout du moins direct, il te faut soit controler apres chaque commande --> donc passé par un fichier temporaire à la place du pipe (si possible), soit te debrouiller pour que la commande apres le pipe tombe en erreur si la 1ere a un code de sortie != 0. ... pas toujours pratique non plus ....
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  8. #8
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Ta deuxième solution m'intéresse ("la commande apres le pipe tombe en erreur si la 1ere a un code de sortie != 0"), mais je ne sais pas comment faire. Si tu as une suggestion...

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    tout depend de ta sequence de commande .... donne l'exemple precis et complet.
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  10. #10
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Je pipe sur tee une commande Oracle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    commande | tee -a fichier.log

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    la je vois pas ...., mais pourquoi le tee , avec rien apres ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    > oracle.log
    tail -f oracle.log &
    commande 
    # ici test de $?
    peut être une solution ... pas tout a fait equivalente mais fonctionnel
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  12. #12
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    C'est pas idiot, ça ! Je vais essayer.

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  13. #13
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    En fait, ça va pas marcher : il me faut absolument un pipe...

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    oui mais pourquoi ? j ai l'impression que tu ne donnes pas toutes les infos ... (je ne comprend pas l'utilité d'un tee sans rien apres (autre pipe couremment)
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  15. #15
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    La commande Oracle, c'est tout simplement le runInstaller : je suis en train de scripter toute une séquence d'installation Oracle. L'inconvénient avec le runInstaller, c'est qu'il se lance tout seul en tache de fond (en asynchrone), ce qui est gênant pour exécuter les commandes suivantes.

    L'avantage du tee est double : le pipe fait que je rends l'exécution du runInstaller synchrone, mais surtout je logue tout ce qui s'affiche à l'écran dans mes propres fichiers de log. C'est pour ça qu'il y a rien derrière, je veux qu'il affiche sur la console de manière tout à fait normale.

    Voila tout mon pb...

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  16. #16
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Bonjour

    Tu peux encapsuler les deux commandes dans des fonctions et piper les fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/sh
    a() {
      foo
    }
    b() {
      bar
    }
     
    a | b
    Le probleme est que tu ne peux pas faire remonter les variables en dehors des fonctions (a moins que je ne me souvienne mal) ce qui te contraint par exemple a utiliser un fichier sur le disque (quelque chose dans ce gout) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/sh
    a() {
      foo
      echo $? > /tmp/foo_result
    }
    b() {
      bar
      echo $? > /tmp/bar_result
    }
     
    a | b
    echo "Execution terminee. foo a renvoye `cat /tmp/foo_result` et bar a renvoye `cat /tmp/bar_result`"
    Wala, c'est pas tres beau, mais ca doit faire ce que tu veux ...

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

  17. #17
    Expert confirmé
    Avatar de Katyucha
    Femme Profil pro
    DevUxSecScrumOps Full Stack Bullshit
    Inscrit en
    Mars 2004
    Messages
    3 287
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Irlande

    Informations professionnelles :
    Activité : DevUxSecScrumOps Full Stack Bullshit

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 287
    Points : 5 075
    Points
    5 075
    Par défaut
    Je suis du même avis que Smortex, c'est exactement ce dont je pensais en lisant les différents posts du fil...
    Grave urgent !!!

  18. #18
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Si j'ai 5 minutes, j'essaierai la proposition.

    Merci pour votre aide.

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  19. #19
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    tu peut "remonter" des variables depuis une fonction, A CONDITION que celle-ci soit declarer ... avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var1=""
    f()
    {
     var1=8
    }
    f
    echo $var1
     
    > 8
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  20. #20
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Citation Envoyé par MarcG
    tu peut "remonter" des variables depuis une fonction, A CONDITION que celle-ci soit declarer ... avant :


    Wala, comme ca c'est nikel 8)

    Smortex

    Les FAQ Assembleur - Linux
    In The Beginning Was The Command Line Neal Stephenson

Discussions similaires

  1. Réponses: 15
    Dernier message: 23/11/2011, 11h35
  2. code en c# pour exécuter une commande dos en arrière plan
    Par GhostMoon dans le forum Windows Forms
    Réponses: 2
    Dernier message: 31/03/2010, 09h48
  3. Réponses: 4
    Dernier message: 04/05/2009, 16h33
  4. [batch] Récupération du code retour d'une commande
    Par fenrys_1 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 06/03/2009, 18h05
  5. [C] code pour executer une commande shell
    Par waldoun dans le forum Linux
    Réponses: 3
    Dernier message: 05/05/2007, 22h41

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