
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 echo
es 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 echo
comando con un printf
que 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 printf
posible 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 -x
para depurar cosas como esta, pero (como ocurre con printf "%q "
) puede usar una representación diferente a la esperada.