Bonjour,
Je viens de lutter avec un problème d'expansion dans bash, et j'ai
trouvé la solution, alors je vous en fait profiter.
J'ai un script de backup qui boucle sur un certain nombre de
répertoires et fait un rsync pour chacun.
J'aimerai simplifier la liste. J'avais ça :
SRC="/etc /home/toto /home/titi /home/tata /home/tutu /usr/local/www /
usr/local/mailman /var/db/lurker
/usr/local/var/www/lurker /usr/local/etc /var/named/etc"
for i in $SRC; do
....
done
J'ai pu simplifier facilement SRC grace à l'utilisation de /home/* :
SRC="/etc /home/* /usr/local/www /usr/local/mailman /var/db/lurker /
usr/local/var/www/lurker /usr/local/etc /var/named/etc"
Je voudrai utiliser aussi :
- "/usr/local/{etc,mailman,www,var/www/lurker}" à la place de "/usr/
local/etc /usr/local/www /usr/local/mailman /usr/local/var/www/lurker"
- "{/,/var/named/}etc" à la place de "/etc /var/named/etc"
Donc idéalement, SRC ressemblerait à ça finalement :
SRC="{/,/var/named/}etc /home/* /usr/local/{etc,mailman,www,var/www/
lurker} /var/db/lurker"
Dans le shell l'expansion est opérationnelle :
$ ls -d1 {/,/var/named/}etc
/etc
/var/named/etc
Mais dès que j'essaye de créer une variable, cela ne fonctionne plus :
$ SRC={/,/var/named/}etc
$ ls -d1 $SRC
ls: {/,/var/named/}etc: No such file or directory
En réalité, les expansions de * et de {} n'ont pas lieu du tout au
même moment, dans le shell. Et pour parvenir à développer les {} quand
on est dans le contexte d'une variable il faut passer par un tableau
(liste) de bash :
$ SRC=( {/,/var/named/}etc)
$ ls -d1 ${SRC[@]}
/etc
/var/named/etc
Et voilà :)
Au final, j'ai bien mon expansion complète :
$ SRC=( {/,/var/named/}etc /home/* /usr/local/{etc,mailman,www,var/
www/lurker} /var/db/lurker )
$ for rep in ${SRC[@]}; do echo $rep; done
/etc
/var/named/etc
/home/toto
/home/titi
/home/tata
/home/tutu
/usr/local/etc
/usr/local/mailman
/usr/local/www
/usr/local/var/www/lurker
/var/db/lurker
patpro_______________________________________________
archives :
http://listes.patpro.net/list/sshfr.fr.html
http://listes.patpro.net/mailman/listinfo/script_shell_fr