rsync erro de sintaxe do script de variáveis

0

Realmente lutando para obter uma variável de argumento de comando para trabalhar com o rsync. O comportamento que estou vendo é esse erro do script:

rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]

No entanto, o script exibe o comando que será executado por meio de um eco, e a mesma cópia de comando colada no terminal (ou de volta ao script como a primeira linha com uma saída depois) funciona bem ?!

Código de script que faz este rsync (check_flags está vazio neste caso):

rsync_cmd=(${check_flags} -rWltpgoDvdHP --delete-before -- \"${backup_dir}\" \"admin@nas-1:${backup_basename}/\")

echo "CMD to run: rsync ${rsync_cmd[@]}"

rsync ${rsync_cmd[@]}

Saída:

CMD to run: rsync -rWltpgoDvdHP --delete-before -- "/share/CACHEDEV1_DATA/veeam_backup_daily/Daily backup _@1am__1" "admin@nas-1:/share/CACHEDEV1_DATA/veeam_backup_daily/"

Eu li on-line que o uso de uma matriz deve ajudar nesse problema, mas isso não aconteceu nesse caso. Tenho quase certeza de que essa é uma solução fácil, mas está me enlouquecendo!

    
por Sirex 29.05.2015 / 03:18

1 resposta

0

O shell analisa aspas antes de substituir as variáveis, portanto, incluir cotações no valor da variável não faz o que você espera (e o echo é altamente enganoso porque não mostra essa distinção). O que você deve fazer é usar aspas sem escape ao definir a matriz (então elas são analisadas como delimitadores em torno dos elementos da matriz, em vez de parte do valor da matriz), em seguida, aspas duplas na referência à matriz (para que não seja dividir ou curinga - expandir os valores na matriz). Eu também substitui o comando echo por um printf que mostra o que acontecerá com mais precisão:

rsync_cmd=(${check_flags} -rWltpgoDvdHP --delete-before -- "${backup_dir}" "admin@nas-1:${backup_basename}/")

printf "%q " CMD to run: rsync "${rsync_cmd[@]}"
printf "\n"

rsync "${rsync_cmd[@]}"

Note que printf pode não mostrar o que você espera - ele irá imprimir uma representação equivalente do comando que será executado, mas existem muitas representações equivalentes diferentes de cada argumento e escolherá um baseado em suas preferências, e não em como foi inserido originalmente. BTW, você também pode usar set -x para depurar coisas como esta, mas (como em printf "%q " ) ele pode usar uma representação diferente da esperada.

    
por 29.05.2015 / 07:44