Compte tenu de ce morceau de bash:
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}
L'écho montre la chaîne PARMS comme prévu, aucune erreur ne s'affiche, mais rsync agit silencieusement comme si les options ajoutées par le + = n'existaient pas. Cependant, cela fonctionne comme prévu:
PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}
Je suppose que j'ai foiré quelque chose avec des guillemets bash (toujours eu des problèmes avec ceux-ci), mais je ne sais pas exactement quoi et pourquoi les options sont ignorées même si la chaîne semble avoir été construite correctement.
echo "$PARMS"
etrsync "${PARMS}"
...bash
version 4.2.25 sans aucun changement.Réponses:
Il y a une différence entre:
et
Dans le premier, les guillemets simples sont à l'intérieur des guillemets eux-mêmes, ils sont donc littéralement présents dans le texte substitué donné
rsync
comme arguments.rsync
obtient un argument dont la valeur est--exclude='.git'
. Dans le second, les guillemets simples sont interprétés par le shell au moment où ils sont écrits, car ils ne sont pas à l' intérieur des guillemets eux-mêmes et peuventrsync
voir--exclude=.git
.Dans ce cas, vous n'avez pas du tout besoin de guillemets simples -
.git
est un mot shell parfaitement valide en lui-même, sans caractères spéciaux, vous pouvez donc l'utiliser littéralement dans la commande.Mieux pour ce genre de chose, cependant, est un tableau :
Cela crée votre commande en tant que mots séparés, avec les guillemets que vous souhaitez interpréter au moment où vous écrivez la ligne du tableau.
"${PARMS[@]}"
s'étend à chaque entrée du tableau en tant qu'argument distinct, même si l'argument lui-même contient des caractères spéciaux ou des espaces,rsync
voit donc ce que vous avez écrit tel que vous le vouliez.la source
bash
effectué le fractionnement de mots après a${PARMS}
été développé. Ainsi, la citation unique a également été interprétée par le shell.\
,'
et"
qui ne résulte pas d'une des extensions ci - dessus sont supprimés. » "extensions ci-dessus" inclut l'extension des paramètres qui effectue l'extension de${PARMS}
.IFS
(généralement des espaces), vous n'avez pas besoin de les citer. S'ils le sont, vous n'avez pas de chance, sauf si vous piratez quelque chose aveceval
- c'est un peu une erreur en général, et les tableaux sont la bonne façon de gérer cela.En plus de la réponse de @Michael Homer , vous pouvez utiliser la
bash
fonction eval :la source
eval
.