Forum Programmation.shell Pipelines et conditions

Posté par  .
Étiquettes : aucune
0
27
oct.
2005
Bonjour,

Je voudrais savoir s'il est possible de ne traiter un pipe que si la commande qui le précède a réussi.

Ce que je voudrais faire ressemble à cela :

 ( grep chaîne fichier1 || grep chaîne fichier2 ) | cut || echo "non trouvé"


Mon problème est que le cut fonctionnant toujours, même si aucun des grep n'a trouvé la chaîne, le message "non trouvé" n'est jamais affiché...

Existe-t-il un moyen d'écrire ça ou dois-je revoir ma façon de faire ?

Merci !
  • # essaye avec grep

    Posté par  . Évalué à 1.

    ( grep chaîne fichier1 || grep chaîne fichier2 ) | cut | grep -E '.+' || echo "non trouvé"

    grep revoie une erreure s'il ne trouve pas de ligne correspondante... donc avec cette syntaxe, s'il y a au moins un caractere dans résultat, le retour est vrai ^^

    bon y a surement un moyen plus élégant, mais j'ai pas toutes mes docs sous la main ^^

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: essaye avec grep

      Posté par  . Évalué à 1.

      C'est vrai que c'est pas super joli mais ça fonctionne...

      Merci :)
  • # PIPESTATUS

    Posté par  . Évalué à 2.

    Je ne sais pas si c'est du Bourne shell de base ou pas, mais en Bash au moins il existe une variable $PIPESTATUS qui est un tableau des différents codes de retour de la dernière série de commandes exécutées.

    Pour faire un "cmd1 | cmd2" suivi d'un test sur le retour de cmd1, tu peux écrire :
    cmd1 | cmd2
    [[ $PIPESTATUS[0] == 0 ]] || echo "cmd1 a echoué"
    • [^] # Re: PIPESTATUS

      Posté par  . Évalué à 1.

      Merci ! Je ne connaissais pas l'existence de cette variable !

      En revanche je n'arrive à y accéder que de cette façon :

      ${PIPESTATUS[0]}
      • [^] # Re: PIPESTATUS

        Posté par  . Évalué à 2.

        > En revanche je n'arrive à y accéder que de cette façon :
        > ${PIPESTATUS[0]}

        Oops, oui bien sûr, typo...

Suivre le flux des commentaires

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