# zenity --progress

## Anard

Bonjour,

Je cherche à faire un script de mises à jour pour Gentoo avec un lanceur utilisant zenity --progress pour mettre à jour l'avancement.

Je dois indiquer à zenity ce qu'il doit afficher avec des 

```
echo "# texte à afficher"
```

Lorsque commence la compilation, je voudrais qu'il affiche la dernière sortie de emerge quand celle-ci évolue

C'est à dire qu'il m'affiche en permanence la dernière ligne de :

```
# emerge -quDN @world

>>> Verifying ebuild manifests

>>> Emerging (1 of 2) media-video/vlc-3.0.16-r6::gentoo

>>> Installing (1 of 2) media-video/vlc-3.0.16-r6::gentoo

>>> Emerging (2 of 2) app-office/libreoffice-bin-7.1.5.2::gentoo

>>> Installing (2 of 2) app-office/libreoffice-bin-7.1.5.2::gentoo
```

Pourriez-vous m'aider ?

upgrade-portage

----------

## xaviermiller

Bonjour,

Peut-être pourrais-tu lire la dernière ligne du fichier "/var/log/emerge.log" ?

----------

## Magic Banana

Je ne suis pas certain de comprendre la question.  S’il s’agit d’afficher avec une barre de progression l’équivalent du « 1 of 2 » dans la sortie d’emerge, zenity --progress lit les pourcentages sur l’entrée standard.  Tu peux t’inspirer de ce petit script Shell : https://dcc.ufmg.br/~lcerf/fr/utilitaires.html#trivialibre

En particulier de la boucle suivante, où tu pourrais remplacer « Question de $author :\n\n$question » par la partie pertinente de dernière ligne renvoyée par emerge (que tu peux écrire dans un tube nommé avec mkfifo et lire avec AWK) :

```
    # The player is presented the question, its author, and a progress bar reaching, second after second, 100% of the delay.

    for percentage in `seq $percentagePerSecond $percentagePerSecond 100`

    do

   sleep 1

   echo $percentage

    done | zenity --progress --window-icon=../token.png --title="Dans la catégorie \"$categoryName\"" --text="Question de $author :\n\n$question"

```

----------

## Anard

Merci pour vos réponses.

En fait, je n'arrive pas à trouver la syntaxe pour afficher le log d'emerge dans ma fenêtre zenity tant qu'emerge est actif. J'ai essayé plusieurs choses dans ce style sans résultat pour le moment :

```
(

   sudo -A emerge -quDN ${SET} > /tmp/upgrade-portage.log &

   pid=$!

   while [[ $(pidof emerge) = $pid ]]

   do

      sleep .5

#      tail -n 1 /tmp/upgrade-portage.log | sed 's/\(.*\)/# \1/'

      echo `tail -n 1 /tmp/upgrade-portage.log | sed 's/\(.*\)/# \1/'`

   done

) | zenity --progress --width=500 --title "Ugrading your system" --pulsate --text ""
```

J'ai l'impression que le log /var/log/emerge.log est un peu trop bavard...

----------

## SnowBear

 *Anard wrote:*   

> Merci pour vos réponses.
> 
> En fait, je n'arrive pas à trouver la syntaxe pour afficher le log d'emerge dans ma fenêtre zenity tant qu'emerge est actif. J'ai essayé plusieurs choses dans ce style sans résultat pour le moment :
> 
> ```
> ...

 

Pour le rendre moins bavard et en fonction de ce que tu veux faire tu peux peut être rajouter un pipe grep sur ton tall ?

Du genre :

```

tail -f /var/log/emerge.log | grep ">>>>"

```

----------

## Magic Banana

Tu n'envoies pas de pourcentages sur l'entrée standard de zenity.  Vois le script sur https://help.gnome.org/users/zenity/stable/progress.html pour un autre exemple, cette fois avec un message évoluant.

Aussi "echo `tail -n 1 /tmp/upgrade-portage.log | sed 's/\(.*\)/# \1/'`" est la même chose que "tail -1 /tmp/upgrade-portage.log | sed 's/^/# /'", qui est quand même plus simple.

----------

## Anard

Merci.

Tu veux dire que c'est parce que je n'envoie pas de pourcentage qu'il n'affiche pas mon texte ?

Parce qu'en fait j'essayais d'abord de voir comment récupérer le log d'emerge puis de l'afficher

[EDIT]

En fait mon souci, c'est que je ne parviens pas à récupérer la sortie du terminal dans zenity :

```

$ sudo emerge -vuDN @world | zenity --text-info --width 500

```

affiche la sortie correctement

Pour la progress bar, le texte doit être précédé de '#' pour être pris en compte

```

$ sudo emerge -vuDN @world | sed 's/^/# /'

# 

# These are the packages that would be merged, in order:

# 

```

C'est bien ce que je veux.

Pourtant en l'envoyant à zenity, ça ne fonctionne pas...

```
# ( echo "20"; emerge -vuDN @world | sed 's/^/# /'; echo "100" ) | zenity --progress --width 500 --height 500

```

n'affiche que 'En cours d'execution'   :Confused: 

----------

## Magic Banana

Je ne comprends pas non plus.  Voilà deux commandes ayant exactement le même effet :

```
$ (sleep 1; printf '10\n# 1\n'; sleep 1; printf '20\n# 2\n'; sleep 1; printf '30\n# 3\n')

$ for i in $(seq 3); do sleep 1; echo $i; done | awk '{ print 10 * $0 "\n# " $0 }'
```

Pourtant, en ajoutant "| zenity --progress" à la fin de chacune des deux commandes, on obtient plus le même résultat.  Dans le premier cas, Zenity montre bien 1, 2 et 3.  Dans le second, seulement le 3 final.  Si tu éclaircis ce mystère, fais-nous en part s’il te plaît.

----------

## Anard

En faisant d'autres essais, j'ai pu découvrir ceci :

```
emerge -pvuDN @world 2>&1 > /tmp/port.log |

(

   while true; do

      sleep .5;

      tail -n 1 /tmp/port.log | sed 's/^/# /'

   done

) | zenity --text-info --auto-kill --pulsate --width 500
```

Fonctionne : le bloc de texte affiche bien "# Calculating dependencies" toutes les demi-secondes.

En revanche, avec --progress, il a besoin de

```
 echo `tail -n 1 /tmp/port.log | sed 's/^/# /'`
```

...

Il semble que l'ajout d'un awk/sed/grep à zenity --progress le trouble, il lui faut un echo ou printf

Du coup avec ce dernier code, cela fonctionne enfin... presque  :Razz: 

Parce que par contre j'ai le souci que rencontrent pas mal de gens apparemment : le bouton annuler ne tue pas emerge, même avec --auto-kill.

J'ai essayé ceci : 

```
#!/bin/bash

sortie () {

   echo annulé

   pkill emerge

   exit 1

}

(

   emerge -pvuDN @world 2>&1 > /tmp/port.log &

   pid=$!

   while true; do

      sleep .5;

      echo `tail -n 1 /tmp/port.log | sed 's/^/# /'`

   done

) | ( zenity --progress --auto-kill --pulsate --width 500 || sortie )

exit 0
```

Et voici le retour :

```
# En cliquant sur le bouton annuler, je dois tuer le processus manuellement :

 $ ./test.sh 

./test.sh : ligne 15 : 15957 Relais brisé (pipe)    ( emerge -pvuDN @world 2>&1 > /tmp/port.log & pid=$!; while true; do

    sleep .5; echo `tail -n 1 /tmp/port.log | sed 's/^/# /'`;

done )

     15958 Fin de la connexion (raccroché)        | ( zenity --progress --auto-kill --pulsate --width 500 || sortie )

 $ pkill emerge

# En revanche en cliquant sur la croix de fermeture de zenity, ça roule...

 $ ./test.sh 

annulé

 $ 
```

 :Confused: 

----------

## Magic Banana

 *Anard wrote:*   

> Il semble que l'ajout d'un awk/sed/grep à zenity --progress le trouble, il lui faut un echo ou printf

 

Oui, c'est aussi ce que j'ai observé... mais c'est quand même bien curieux.

 *Anard wrote:*   

> Parce que par contre j'ai le souci que rencontrent pas mal de gens apparemment : le bouton annuler ne tue pas emerge, même avec --auto-kill.

 

Essaie d'enlever --auto-kill ainsi que les autres choses apparemment inutiles (notamment les sous-shells) :

```
#!/bin/sh

sortie () {

   echo annulé

   pkill emerge

   exit 1

}

emerge -pvuDN @world 2>&1 > /tmp/port.log &

while true; do

   sleep .5;

   echo $(sed -n '$ s/^/# /p' /tmp/port.log)

done | zenity --progress --pulsate --width 500 || sortie
```

Pour sortir sans erreur, il te faudra aussi remplacer true (par pgrep emerge je suppose).

----------

