Dado este pedaço de bash:
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}
O eco mostra a sequência de PARMS conforme o esperado, nenhum erro é exibido, mas o rsync age silenciosamente como se as opções adicionadas pelo + = não existissem. No entanto, isso funciona conforme o esperado:
PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}
Eu acho que estraguei algo com aspas bash (sempre tive problemas com elas), mas não sei exatamente o que e por que as opções são ignoradas, mesmo que a string pareça ter sido criada corretamente.
echo "$PARMS"
ersync "${PARMS}"
...bash
versão 4.2.25 sem nenhuma alteração.Respostas:
Há uma diferença entre:
e
Na primeira, as aspas simples estão entre aspas, e estão literalmente presentes no texto substituído, dado
rsync
como argumento.rsync
obtém um argumento cujo valor é--exclude='.git'
. No segundo, as aspas simples são interpretadas pelo shell no momento em que são escritas, porque elas não estão entre aspas ersync
conseguem ver--exclude=.git
.Nesse caso, você não precisa de aspas simples -
.git
é uma palavra shell perfeitamente válida por si só, sem caracteres especiais, para que você possa usá-la literalmente no comando.Melhor para esse tipo de coisa, porém, é uma matriz :
Isso cria seu comando como palavras separadas, com qualquer citação que você deseja interpretar no momento em que escreve a linha da matriz.
"${PARMS[@]}"
expande para cada entrada na matriz como um argumento separado, mesmo que o argumento em si tenha caracteres ou espaços especiais, pararsync
que ele veja o que você escreveu como pretendia.fonte
bash
executou a divisão da palavra após ter${PARMS}
sido expandida. Portanto, as aspas simples também foram interpretadas pelo shell.\
,'
e"
. Que não resultou de uma das expansões acima são removidas" "expansões acima" inclui expansão de parâmetro que realiza a expansão de${PARMS}
.IFS
(geralmente de espaço em branco), você não precisa citá-los. Se estiverem, você não terá sorte, a menos que hackear algo juntoeval
- isso é um pouco incorreto em geral, e as matrizes são a maneira certa de lidar com isso.Além da resposta de @Michael Homer , você pode usar a
bash
função eval :fonte
eval
.