Forum Programmation.shell affichage du résultat de plusieurs commandes avec pipes [résolu]

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
18
juil.
2018

Bonjour,

J'aurais besoin de vos lumières…

Je voudrais envoyer le résultat de plusieurs commandes (avec pipe) dans Zenity (pour témoigner du bon fonctionnement du script).
Pour simplifier je prendrais cet exemple:

borg check -v --repository-only /mnt/sauvegarde1 2>&1 | sed 's/^.*/#&/g' | zenity --progress --pulsate

Et là ça ne fonctionne pas…
Quelques explications : dans la barre de progression de zenity le message peut être actualisé en lui envoyant des lignes préfixées par # (voir Zenity) d'où la commande sed.
Le problème est que le résultat du 1er pipe est envoyé en bloc à zenity, à la fin du traitement, et non pas au fur et à mesure. Zenity n'affiche donc que la dernière ligne quand le traitement des commandes est complètement finit.
Cela est vérifiable avec :

    borg check -v --repository-only /mnt/sauvegarde1 2>&1 | sed 's/^.*/#&/g' | tr "\n" "o"

qui affiche tous les résultats sur une ligne en supprimant des retours à la ligne, donc tr reçoit tous les résultats en un seul bloc et pas des lignes au fur et à mesure (il n'y aurait pas de retour à la ligne dans ce cas).

A noter que le problème n'est pas lié à sed puisque j'ai le même comportement avec tee.

J'ai beau tourner le problème dans tous les sens je ne trouve pas de solution…
Comment faire pour envoyer les résultats des premières commandes à zenity de façon progressive ?
Une idée géniale ???

NB: la balise "Code Block" dans l’éditeur de message ne fonctionne pas, je suis allé chercher la balise dans l'aide à l'édition du wiki.

  • # au hazard

    Posté par  . Évalué à 3.

    tu chercherais pas à reinventer l'option --progress de borg ?

    borg --progress -v --repository-only […]

    • [^] # Re: au hazard

      Posté par  . Évalué à 1.

      En fait non mais c'est très bien vu ! J'avais loupé cette option…

      J'ai pris cet exemple pour faire simple mais en fait j'ai fait un petit script (pas loin de 200 lignes avec les commentaires) de sauvegarde pour mes besoins personnels qui enchaîne borg create puis borg prune puis borg check.
      Je viens de vérifier mais je ne peux pas utiliser l'option progress dans mon script car j'utilise des redirections de stdout et stderr dans une fonction pour écrire dans fichier de log, du coup la progression ne s'affiche pas (et en plus il faudrait que j'arrive à la rediriger dans zenity).

      Je voulais donc afficher une barre d'attente, en mode graphique, pour que les utilisateurs ne coupent pas l'ordinateur pendant la sauvegarde et sache que le script n'est pas planté.

      Une autre idée ?

      • [^] # Re: au hazard

        Posté par  . Évalué à 2.

        tu peux tester l'hypothese emise en dessous, que ce soit le buffer de sed,

        mais si tu as tester un borg check >/tmp/log avec un tail -f /tmp/log depuis un autre terminal,
        et que tu ne vois rien avant la fin, c'est bien que borg bufferise.

        l'option progress ne semble pas faire ce que tu veux, mais permet peut-etre d'avoir un affichage,
        et de recuperer cet affichage pour le mettre dans zenity, plutot que de scripter des trucs à toi.

        à voir si tu rediriges tous les canaux dans un seul, puis que tu filtres/retravailles

  • # sed et tampon

    Posté par  . Évalué à 4.

    Salut,
    Ce comportement est causé par sed qui bufferise la sortie.
    Tu dois pouvoir obtenir le comportement qui t'intéresse en ajoutant l'option "--unbuffered" à sed.

    • [^] # Re: sed et tampon

      Posté par  . Évalué à 1.

      Bonsoir,

      Je rentre juste du travail et alors là merci !!!
      Effectivement avec "--unbuffered" ça fonctionne parfaitement. Je n'aurais jamais trouvé seul.

      Ma commande fonctionnelle:

      borg check -v --repository-only  /mnt/sauvegarde1 2>&1 | sed --unbuffered  's/^.*/#&/g' | zenity --progress --pulsate

      Pour NeoX : le controle de tail -f /tmp/log pendant que borg check -v /mnt/sauvegarde1 2>/tmp/log tourne sur un autre terminal montre un affichage progressif des informations.

      Merci encore à vous 2. Cela faisait quand même 2 jours que je tournais en rond…

      • [^] # Re: sed et tampon

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

        <toubonnais>Pour info, un emballage qui va bien pour jouer avec la tamponnisation : stdbuf des outils centraux.</toubonnais>

        <frenglish>Pour info, un wrapper qui va bien pour jouer avec la bufferisation : stdbuf des coreutils.</frenglish>

        Debian Consultant @ DEBAMAX

        • [^] # Re: sed et tampon

          Posté par  . Évalué à 1. Dernière modification le 18 juillet 2018 à 23:05.

          Magnifique commande que stdbuf, totalement inconnue pour ma part… Cela m'aurait fait gagner beaucoup de temps, je la garde précieusement.
          Merci.

Suivre le flux des commentaires

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