Tengo un comando rsync con los siguientes parámetros:
rsync -avz --{partial,stats,delete,exclude=".*"}
Quiero poner esos parámetros dentro de una variable para reutilizarlos después en el script. Algo como esto:
#!/bin/bash
VAR=rsync -avz --{partial,stats,delete,exclude=".*"}
$VAR /dir1 /dir2
He intentado con comillas, comillas simples, corchetes, sin ningún éxito.
bash
shell-script
Kellyson
fuente
fuente
Respuestas:
Poner un comando complejo en una variable nunca es un enfoque recomendado. Ver BashFAQ / 050 - Estoy tratando de poner un comando en una variable, ¡pero los casos complejos siempre fallan!
Su requisito se vuelve realmente simple, si simplemente decide usar una función en lugar de una variable y pasarle argumentos.
Algo como
y ahora pasale los argumentos requeridos como
La definición de la función es bastante simple, primero verificamos el recuento de argumentos de entrada usando la variable
$#
que no debería ser cero. Lanzamos un mensaje de error que dice que no se proporcionan argumentos. Si hay argumentos válidos,"$@"
representa los argumentos reales suministrados a la función.Si esta es una función que usaría con bastante frecuencia, es decir, en scripts / línea de comandos también, agréguela a los archivos de inicio de la shell
.bashrc
,.bash_profile
por ejemplo.O como se señaló, puede valer la pena expandir la expansión de la llave para separar los args para una mejor legibilidad como
fuente
Esto intenta ejecutar el comando
-avz
con argumentos--partial
,--stats
etc. y conVAR
set torsync
en el entorno.El formulario entre comillas no funciona porque las llaves no se expanden entre comillas, ni dentro de las asignaciones, y tampoco se expanden después de que se expande una variable.
Si necesita almacenar argumentos de línea de comando en una variable, use una matriz:
Ahora
"${args[@]}"
se expandirá arsync
,-avz
,--partial
, etc, como palabras distintas.Las matrices también le permiten agregar opciones a la lista, condicionalmente si es necesario, por lo que puede, por ejemplo:
fuente
Al menos puede guardar las opciones parcialmente en una variable:
Las pruebas son importantes porque el enmascaramiento puede ser difícil:
Dado que hay múltiples alternativas, como usar el historial, usar un alias, usar una función, no hay un caso de uso obvio en el que pueda pensar. Rara vez se comparte una opción compleja entre diferentes programas, por lo que para una solución ad-hoc para el shell interactivo, el alias parece una mejor manera:
Su muestra
no puede funcionar, porque la tarea es endet en el primer espacio en blanco. Tienes que enmascarar los espacios en blanco:
una cosa bastante peligrosa para las pruebas, con esa opción de eliminación, ¿no es así? Como las opciones pueden contener nuevamente "," y comillas simples, el enmascaramiento puede ser difícil muy pronto. Iría por un alias o confiaría en la historia.
Se puede almacenar un alias en el archivo ~ / .bashrc para su uso continuo en varias sesiones. Las funciones también se pueden almacenar en el bashrc, pero solo las necesita, si desea manejar los parámetros, pasados a la función para ser evaluados allí.
fuente