
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 echo
comando por um printf
que 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 printf
pode 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 -x
para depurar coisas como esta, mas (como acontece com printf "%q "
) pode usar uma representação diferente da esperada.