Logo Bash Lorsqu’on développe un “petit” script bash, on peut parfois vouloir y ajouter une interface graphique basique. Le plus simple pour cela est d’utiliser zenity. Cet utilitaire fournit des boites de dialogue en Gtk pour différents usages.

Zenity est très pratique, mais souffre d’un bug horripilant. Regardez plutôt :

$ zenity --info
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

En fonction de la version de zenity, ce message d’erreur est systématique et s’affiche à chaque appel du programme. Il gêne beaucoup de monde car bien qu’envoyé sur STDERR donc ne bloquant pas le fonctionnement normal de zenity (dont on exploite uniquement la sortie standard STDOUT et les statuts de sortie $?), mais pollue visuellement la console si vous suivez ce qu’il s’y passe pendant l’exécution de votre script.

La solution qui est proposée à chaque fois est de se débarrasser de STDERR, de cette manière : zenity --info 2>/dev/null. Hop, plus de message d’erreur, et on peut même rendre cette solution plus “permanente”.

Sauf que… on n’a plus de message d’erreur du tout, pas uniquement celle qui nous gêne.

J’ai donc recherché une solution plus élégante et moins radicale et j’ai trouvé mon bonheur sur ce billet de blog (en) qui explique comment bidouiller avec les fichiers de sortie pour filtrer STDOUT avec grep, puis j’ai complété la solution avec cette réponse sur Stackoverflow (en) pour pouvoir continuer à exploiter le statut de sortie de zenity.

On en arrive à la solution ci-dessous :

zenity() { command zenity "$@" 3>&1 1>&2 2>&3 | grep -v "transient"; exit ${PIPESTATUS[0]} ) 3>&1 1>&2 2>&3

La même, mieux formatée sur plusieurs lignes :

zenity() {
  ( command zenity "$@" 3>&1 1>&2 2>&3 | grep -v "transient"
    exit ${PIPESTATUS[0]}
  ) 3>&1 1>&2 2>&3
}

Insérez ce code au début de votre script, ou dans votre bashrc, et utilisez zenity comme avant, sans être pollué par ce message, tout en conservant les autres éventuels messages d’erreur.