C'est simplement le word splitting de sh. Pour supprimer le
word splitting, il suffit de mettre des guillemets:
$ for i in "`echo foo | sed -e 's/foo/"a a"/g'`"; do echo ".$i."; done
."a a".
J'y aurais bien pensé seulement voilà comme je l'expliquais, il s'agit de
transmettre une liste d'argument issue d'une commande fournie par une
bibliothèque du type `lib-config --cflags` ; il y a donc plusieurs
arguments et je dois en modifier certains. Si je met des guillemets sur
l'ensemble toutes les commandes seront concaténées. Je veux juste que
certaines commandes composées de deux mots (donc avec un espace au milieu)
ne sous pas coupées.
ou de redéfinir la variable IFS:
$ IFS=
$ for i in `echo foo | sed -e 's/foo/"a a"/g'`; do echo ".$i."; done
."a a".
En revanche, si tu veux splitter sur certains espaces mais pas sur
d'autres dans la même chaîne, c'est impossible: il faut contourner
le problème d'une manière ou d'une autre. De toute façon, le word
splitting, c'était une mauvaise idée. En cela, zsh est bien meilleur.
Super, ça fonctionne !
mais la façon dont cela fonctionne est des plus curieuse,
voici le hack que j'ai mis dans mon Makefile :
rule:
IFS=^ ; \
cmd arg1 arg2 \
`lib-config --cflags | sed \
-e 's/ /^/g' \
-e 's/-optx/-arg3^-optx/g' \
-e 's/-framework^Cocoa/-arg4^"-framework Cocoa"/g'`
ce qui m'étonne c'est que le "word-spliting" reste sur l'espace hors du
sous-shell, et que l'action de IFS n'interagisse que dans le sous-shell.
Je n'arrive pas à comprendre la logique de ce comportement,
mais bon lol ça fonctionne...
Merci beaucoup !