Solution avec sed : j'y avais bien pensé mais je cherchais une solution "tout bash" peut être plus élégante
Solution "set -f/+f" : ça marche nickel
Ce qui donne dans mon script de test :
Concernant les demandes de précision de lilian_h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 $ cat test.sh #!/bin/sh # test.sh VAR="config.h *.c~ *.sh" ret="" set -f for v in $VAR do ret+=" -x $v"; done set +f echo "je devrais avoir:" echo "diff -ur -x config.h -x *.c~ -x *.sh old new" echo "et je l'ai effectivement:" echo "diff -ur $ret old new"
Le script est en fait l'outil cygport, un outils de fabrication des paquets cygwin.
Il possède une commande DIFF qui permet de générer un patch entre la version de référence et la version modifiée du paquet.
Cette commande fait un "diff -ur ..." entre 2 arbo et c'est celle-ci qui me pose problème (le source est consultable ici)
Il est possible d'indiquer les fichiers à ignorer (.bak, .*~ etc) en définissant une variable DIFF_EXCLUDES dans le fichier de configuration du paquet.
Voici un extrait du code (actuellement ligne 226)
${default_excludes} et ${DIFF_EXCLUDES} correspondent à ${VAR} de mon exemple
Et comme je l'ai écrit précédemment, si je l'entoure entre un set -f / set +f, cela fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 226 for exclude in ${default_excludes} 227 do 228 diff_excludes_x+=" -x ${exclude}"; 229 done 230 231 case ${DIFF_EXCLUDES} in 232 -x*) 233 diff_excludes_x+=" ${DIFF_EXCLUDES}"; 234 ;; 235 *) 236 for exclude in ${DIFF_EXCLUDES} 237 do 238 diff_excludes_x+=" -x ${exclude}"; 239 done 240 ;; 241 esac
Partager