Estoy tratando de escribir un script de shell que llama a otro script que luego ejecuta un comando rsync. El segundo script debe ejecutarse en su propia terminal, por lo que uso un comando gnome-terminal -e "..." . Uno de los parámetros de este script es una cadena que contiene los parámetros que se deben dar a rsync. Los puse entre comillas simples. Hasta aquí, todo funcionaba bien hasta que uno de los parámetros de rsync era una ruta de directorio que contenía un espacio. Probé numerosas combinaciones de ',",\",\' pero el script no se ejecuta en absoluto o solo se toma la primera parte de la ruta.
Aquí hay una versión ligeramente modificada del código que estoy usando
gnome-terminal -t 'Rsync scheduled backup' -e "nice -10 /Scripts/BackupScript/Backup.sh 0 0 '/Scripts/BackupScript/Stamp' '/Scripts/BackupScript/test' '--dry-run -g -o -p -t -R -u --inplace --delete -r -l '\''/media/MyAndroid/Internal storage'\''' " Dentro Backup.sh se ejecuta este comando
rsync $5 "$path" donde la $path destino se calcula a partir del texto en Stamp .
¿Cómo puedo lograr estos tres niveles de cotizaciones anidadas?
Estas son algunas preguntas que miré hace un momento (también probé otras fuentes antes)
No pude aplicar las soluciones a mi problema.
Aquí hay un ejemplo. caller.sh usa gnome-terminal para ejecutar foo.sh , que a su vez imprime todos los argumentos y luego llama a rsync con el primer argumento.
llamador.sh :
#!/bin/bash gnome-terminal -t "TEST" -e "./foo.sh 'long path' arg2 arg3"foo.sh :
#!/bin/bash echo $# arguments for i; do # same as: for i in "$@"; do echo "$i" done rsync "$1" "some other path" Editar: si $1 contiene varios parámetros para rsync, algunos de los cuales son rutas largas, lo anterior no funcionará, ya que bash pasa "$1" como un parámetro o $1 como varios parámetros, dividiéndolo sin tener en cuenta las comillas contenidas.
Hay (al menos) una solución alternativa, puede engañar a bash de la siguiente manera:
llamador2.sh :
#!/bin/bash gnome-terminal -t "TEST" -e "./foo.sh '--option1 --option2 \"long path\"' arg2 arg3"foo2.sh :
#!/bin/bash rsync_command="rsync $1" eval "$rsync_command" Esto hará el equivalente a escribir rsync --option1 --option2 "long path" en la línea de comando.
ADVERTENCIA : este truco presenta una vulnerabilidad de seguridad, $1 puede diseñarse para ejecutar varios comandos si el usuario tiene alguna influencia sobre el contenido de la cadena (por ejemplo '--option1 --option2 \"long path\"; echo YOU HAVE BEEN OWNED' ejecutará rsync y luego ejecutará el comando echo ).
¿Intentó escapar del espacio en la ruta con "\" (sin comillas)?
gnome-terminal -t 'Rsync scheduled backup' -e "nice -10 /Scripts/BackupScript/Backup.sh 0 0 '/Scripts/BackupScript/Stamp' '/Scripts/BackupScript/test' '--dry-run -g -o -p -t -R -u --inplace --delete -r -l ''/media/MyAndroid/Internal\ storage''' "