Como uso uma variável Bash (string) contendo aspas em um comando?

45

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
Reilly Beacom
fonte

Respostas:

55

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
Gordon Davisson
fonte
Santo Jezus, funciona!
Slawomir
-2

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
Franck Lefort
fonte
5
echonã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.
Gordon Davisson