bash adiciona valor à matriz com variável incorporada e aspas simples

4

Tenho certeza de que está completamente claro no assunto :) Brincadeiras à parte, acho que parte do problema que estou tendo em encontrar uma resposta é escrever os termos da pesquisa.

Tive boa sorte ao emitir comandos em um script bash usando uma matriz para os argumentos.

Por exemplo, estou chamando o rsync e criei uma matriz como (alerta de spolier - variáveis supérfluas serão referenciadas posteriormente):

#!/usr/bin/env bash
set -euo pipefail
rf=.rsync-filter
srcff="/home/roger/home$rf"

hm=/home/roger
syncto=/tmp/to-remote/home

rsarg=(-avv --prune-empty-dirs --stats)
rsarg+=(--dry-run)

rsync "${rsarg[@]}" "$hm" "$syncto/"  #works

exit

Onde estou tendo problemas é adicionar a variável $ srcff a uma regra de filtro e adicionar isso à matriz rsarg.

rsarg+=("--filter='merge $srcff'") # no dice
# or this
rsarg+=("--filter='merge ${srcff}'") # sad trombone

Ao correr, recebo:

$ ./home-sync-simple
Unknown filter rule: ''merge /home/roger/home.rsync-filter''
rsync error: syntax or usage error (code 1) at exclude.c(904) [client=3.1.1]

Posso fazê-lo funcionar adicionando a regra de mesclagem à linha rsync, fora da matriz e menos a variável incorporada:

rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' "$hm" "$syncto/"

A substituição do filtro acima pela variável fora do array falha da mesma maneira:

rsync "${rsarg[@]}" "--filter='merge $srcff'" "$hm" "$syncto/" 

Eu tentei muitas outras variações, estou assumindo todos os possíveis, com exceção do que realmente funciona. Às vezes, isso resulta em "fim inesperado da regra de filtro: mesclagem" e outras coisas. Eu os excluí por brevidade e porque acho que as versões acima estão mais próximas da correção (ele disse, nervosamente). Eu estou supondo que acabo passando muito poucos argumentos.

Obrigado antecipadamente!

    
por roger 02.04.2017 / 20:43

1 resposta

4

Se isso funcionar:

rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' ...

Então, suponho que você não queira fornecer as aspas simples para rsync . Aqui, o shell come-os antes que rsync os veja. Seus outros exemplos têm aspas entre aspas, então os internos ficam e são passados por rsync para ver.

Portanto, pule as aspas simples ao criar a matriz:

rsarg+=("--filter=merge $srcff")

Note que, do ponto de vista do shell, o sinal de igual não é nada especial, e não há necessidade de tratar a parte que vem depois de algo diferente da parte anterior. --foo=bar é o mesmo que --foo="bar" ou "--foo=bar" ou mesmo --fo"o=ba"r .

    
por 02.04.2017 / 20:52