erro de sintaxe de script de variáveis ​​rsync

erro de sintaxe de script de variáveis ​​rsync

Estou realmente lutando para conseguir que uma variável de argumento de comando funcione com o rsync. O comportamento que estou vendo é este 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 gera o comando que será executado por meio de um eco, e exatamente a mesma cópia do comando colada no terminal (ou de volta ao script como a primeira linha com uma saída depois) funciona perfeitamente?!

Código de script que faz esse 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 um array deveria ajudar nesse problema, mas não foi o que aconteceu neste caso. Tenho quase certeza de que esta é uma solução fácil, mas está me deixando louco!

Responder1

O shell analisa aspas antes de substituir as variáveis, portanto, incluir aspas no valor da variável não faz o que você espera (e echoé altamente enganoso porque não mostra essa distinção). O que você deve fazer é usar aspas sem escape ao definir a matriz (para que sejam analisadas como delimitadores em torno dos elementos da matriz, em vez de parte do valor da matriz) e, em seguida, colocar aspas duplas na referência à matriz (para que não seja palavra- dividir ou expandir com curinga os valores na matriz). Eu também substituiria o echocomando por um printfque mostrará o que vai 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[@]}"

Observe que printfpode não mostrar o que você espera - imprimirá umequivalenterepresentação do comando que será executado, mas há muitas representações equivalentes diferentes de cada argumento, e ele escolherá uma com base em suas preferências, não em como foi originalmente inserido. Aliás, você também pode usar set -xpara depurar coisas como esta, mas (como acontece com printf "%q ") pode usar uma representação diferente da esperada.

informação relacionada