Pages

dimanche 14 octobre 2012

Zsh et le danger des modificateurs

Zsh est très bien comme shell mais fait plus de choses que bash, ce qui peut engendrer des bugs quand celui-ci est le shell par défaut et que des scripts ne définissent pas l’interpréteur utilisé…
Actuellement j'ai eu le coup une fois, lorsqu'il fallait charger le module canberra-gtk pour les programmes java.
En fait une variable $GTK_MODULES est définie et contient tous les modules gtk séparés par des deux points (:).
Visiblement j'ai 2 modules gtk, tous 2 servant à ajouter canberra-gtk-module. Les fautifs ? 52libcanberra-gtk-module_add-to-gtk-modules et 52libcanberra-gtk3-module_add-to-gtk-modules. Avec un code identique :

if [ -z "$GTK_MODULES" ] ; then
    GTK_MODULES="canberra-gtk-module"
else
    GTK_MODULES="$GTK_MODULES:canberra-gtk-module"
fi

export GTK_MODULES
Et la paf c'est le drame, GTK_MODULES=canberra-gtk-moduleanberra-gtk-module. naturellement :D.
Vous venez d'assister à l'effet du modifier :c qui au passage n'existe pas et disparaît. Pour info, ce n'est pas le cas de :g, tout aussi inexistant mais qui s'affiche quand même…
Possible que ma doc ne soit pas à jour.

Les modifiers existe aussi dans bash mais sont moins nombreux et ne s'utilisent qu'avec l'historique (paragraphe HISTORY EXPANSION du man).

echo unfichier.txt
echo !:1:r

resultat :
unfichier.txt
unfichier

Quasiment jamais utilisé en fait.
Mais voilà, zsh les généralise aussi aux variables ce qui engendre une erreur dans la variable GTK_MODULES.

Alors comment faire ?
Simple, entourer la variable d'accolades:
GTK_MODULES="${GTK_MODULES}:canberra-gtk-module"

Aucun commentaire: