Falha, exemplo simplificado:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Eu preciso incluir as aspas como se o comando fosse assim:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Falha, exemplo simplificado:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Eu preciso incluir as aspas como se o comando fosse assim:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Respostas:
Resposta curta: consulte BashFAQ # 50 ("Estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham!").
Resposta longa: Colocar comandos (ou partes de comandos) em variáveis e depois recuperá-los intactos é complicado. Quando o shell expande uma variável na linha de comando, se a variável estiver entre aspas duplas, ela não é analisada; se não estava entre aspas, os espaços são analisados como quebras de argumento, mas as aspas e escape não são analisados. Em qualquer um dos casos, colocar aspas no valor da variável não é útil.
Geralmente, a melhor maneira de fazer esse tipo de coisa é usar uma matriz em vez de uma variável de texto simples:
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
eval é outra opção:
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
Veja também:
Eu não vejo o problema :
$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"
Talvez você precise citar novamente o valor:
$ rsync "$FLAGS" dir1 dir2
echo
não está mostrando o que você pensa que é. Tente printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"
ver por que nenhuma dessas opções funciona.