Error de sintaxis del script de variables rsync

Error de sintaxis del script de variables rsync

Realmente estoy luchando por conseguir que una variable de argumento de comando funcione con rsync. El comportamiento que veo es este error del 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]

Sin embargo, el script genera el comando que va a ejecutar a través de un eco, y la copia exacta del mismo comando pegada en la terminal (o nuevamente en el script como la primera línea con una salida después) funciona bien.

Código de script que realiza este rsync (check_flags está vacío en este 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[@]}

Producción:

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/"

Leí en línea que el uso de una matriz debería ayudar con este problema, pero no fue así en este caso. Estoy bastante seguro de que esto es una solución fácil, ¡pero me está volviendo loco!

Respuesta1

El shell analiza las comillas antes de sustituir variables, por lo que incluir comillas en el valor de la variable no hace lo que se espera (y echoes muy engañoso porque no muestra esta distinción). Lo que debe hacer es usar comillas sin escape al definir la matriz (para que se analicen como delimitadores alrededor de los elementos de la matriz, en lugar de como parte del valor de la matriz), luego entrecomillar dos veces la referencia a la matriz (para que no forme palabras). dividir o expandir con comodines los valores en la matriz). También reemplazaría el echocomando con un printfque mostrará lo que sucederá con mayor precisión:

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[@]}"

Tenga en cuenta que es printfposible que no muestre lo que espera: imprimirá unequivalenterepresentación del comando que se ejecutará, pero hay muchas representaciones equivalentes diferentes de cada argumento, y elegirá una según sus preferencias, no cómo se ingresó originalmente. Por cierto, también puedes usarlo set -xpara depurar cosas como esta, pero (como ocurre con printf "%q ") puede usar una representación diferente a la esperada.

información relacionada