Estoy usando Fish Shell y tengo una función auxiliar para generar un comando rsync con todos mis parámetros configurados. El comando rsync final debería ser así (el comando está en una línea, lo hice en varias líneas porque es más fácil de leer):
rsync -razs -e="ssh -p2222" --update --progress \
--exclude=".*" --exclude="__pycache__"
--delete --dry-run \
$source_dir $dest_dir
Desde la terminal funciona bien, pero cuando intento utilizar mi función auxiliar, los parámetros de "exclusión" parecen no tener ningún efecto. El comando generado se ve exactamente igual excepto que el comando ssh no está entre comillas. Sin embargo, esto no parece ser un problema ya que puedo conectarme al servidor. Como dije, el único problema es que se ignoran las exclusiones.
El comando generado se ve así:
rsync -razs -e=ssh -p2222 --update --progress \
--exclude=".*" --exclude="__pycache__" \
--delete --dry-run \
/home/some_folder user@host:/home/
¿Alguna idea?
La función se ve así:
function ssync -d "rsync through ssh tunnel"
set origin $argv[1]
set destination $argv[2]
set exclude ".*" "__pycache__"
set ssh_config "ssh -p2222"
set params -razs -e="$ssh_config" --update --progress --exclude=\"$exclude\"
if test (count $argv) -gt 2
set option $argv[3]
set params $params --delete
if [ $option = "--delete" ]
set_color red; echo "Warning: Unsafe run!";
read -l -P "Confirm? [y/N] " yesno;
switch $yesno
case '' N n
echo "Sync canceled by user"
return 0
case Y y
echo "Proceeding..."
end
else
set params $params --dry-run
end
end
echo "rsync $params $origin $destination"
rsync $params $origin $destination;
end
[EDITAR]: Gracias a la respuesta de Glenn, entiendo que el uso de comillas literales en la función es lo que causa el problema. Sin embargo, tiene el efecto muy conveniente de separar un argumento con múltiples valores separados por espacios como arg1 arg2
en algo como --exclude="arg1" --exclude="arg2"
. ¿Alguna forma de tener las ventajas sin los inconvenientes?
Respuesta1
Estás agregando caracteres de comillas literales.
... --exclude=\"$exclude\"
Eso hará que rsync busque archivos que literalmente tengan comillas en el nombre del archivo.
Solo quieres usar comillas para rodear la palabra.
... "--exclude=$exclude"
Tenga en cuenta que el propósito de las comillas es indicarle al shell que tokenice el comando de la maneratúquiero que lo haga. Las comillas reales se eliminan antes de que el shell ejecute el comando.
Vale, tienes unlistade artículos en $excluir. Utilice llaves en su lugar: demostración:
$ set exclude ".*" file1 file2
$ set params --some stuff --other stuff --exclude={$exclude}
$ echo $params
--some stuff --other stuff --exclude=.* --exclude=file1 --exclude=file2
Tenga en cuenta que si $exclude está vacío, los parámetros contendránNo--excluir opciones:
$ set -e exclude
$ set params --some stuff --other stuff --exclude={$exclude}
$ echo $params
--some stuff --other stuff