Forum Programmation.shell Enchainement de pipe

Posté par  .
Étiquettes : aucune
1
20
avr.
2010
Bonjour,
si je fait un
ps -edf | grep toto | grep -v tata && echo $?
je n'ai pas de code retour...La commande ne renvoi rien...
Comment récupérer le code retour de cette enchainement de pipe?
Merci.
  • # Point-virgule

    Posté par  . Évalué à 8.

    Et comme ça :
    ps -edf | grep toto | grep -v tata ; echo $?
    • [^] # Re: Point-virgule

      Posté par  . Évalué à 4.

      C'est bel et bien un point-virgule qui résout son problème. Je ne vois pas pourquoi tu as été moinssé :-)

      la partie "&& echo $?" ne fait rien pour la simple raison que le second grep indique qu'il n'a rien trouvé, donc ce qui suit le && n'est pas appelé (c'est fait pour).
      • [^] # Re: Point-virgule

        Posté par  . Évalué à 1.

        En fait si tu fais
        a|b|c; echo $?
        tu récupères le return code de c

        $ps|sl; echo $?
        bash: sl: command not found
        127

        $ ps|sl|ls; echo $?
        bash: sl: command not found
        Liste de fichiers que c'est chez moi
        0

        (on me souffle dans l'oreillette que ma réponse n'est pas complète : si la commande b casse le (sa) pipe, on devrait avoir son rc à elle -b, donc-)

        note : Nommer son post "Enchainement de pipe", c'est très provocateur :p
  • # Re: Enchainement de pipe

    Posté par  (site web personnel) . Évalué à 7.

    Dans a && b, b est exécuté si et seulement si a a renvoyé 0. Donc dans ton cas, la seule chose qui peut être affichée par ton echo est 0. En remplaçant && (qu'il faut voir comme un opérateur logique) par ; (opérateur de séquencement, on va dire), tu verras le code de retour du dernier élément du pipe.

    Autre chose : si tu veux faire des recherches sur les processus en cours d'exécution, utilise plutôt pgrep, disponible sous tous les Unix modernes, et qui sera bien moins sensible aux variations dans les formats de ps.
    • [^] # Re: Enchainement de pipe

      Posté par  . Évalué à 2.

      Autre chose : si tu veux faire des recherches sur les processus en cours d'exécution, utilise plutôt pgrep, disponible sous tous les Unix modernes, et qui sera bien moins sensible aux variations dans les formats de ps.

      Non, il n'est pas disponible sur tous les unix modernes comme tu le prétends. D'autre part il y a encore beaucoup de boites qui bossent avec de vieilles versions Unix (Solaris 8, HP-UX 11.11 voire 11.0, ou AIX 4.3). Donc si on veut un script portable il faut se méfier.
  • # Solution

    Posté par  . Évalué à 1.

    Merci.
    echo $? n'est pas traité car grep -v renvoie 1 en cas de réussite et non pas 0 comme d'habitude ! C'est l'exeption ...
    Bonne journée.
    • [^] # Re: Solution

      Posté par  . Évalué à 4.

      heu ... non ! grep renvoie 0 quand des lignes passent le filtre, et pas 0 quand rien ne passe.

      $ echo bla |grep -v 'i';
      bla
      $echo $?
      0
      $ echo bla |grep -v 'a';
      $echo $?
      1


      avec -v, le filtre est inversé, mais pas le retour de grep.
      • [^] # Re: Solution

        Posté par  . Évalué à 3.

        heu ... non ! grep renvoie 0
        héhé, ton "!" est placé de manière déroutante :p
        grep renvoie 0 (...)
        et
        ! grep renvoie 1 (...)
        • [^] # Re: Solution

          Posté par  . Évalué à 2.

          tss tss tss, c'était pas dans la balise code, c'était du français ;-)

          mais, bien vu !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.