El comando Rsync generado por peces tiene efectos inesperados

El comando Rsync generado por peces tiene efectos inesperados

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 arg2en 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 maneraquiero 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

información relacionada