Por que às vezes tenho que duplicar espaços de escape em caminhos rsync?

1

Ao se referir a caminhos com espaços, por exemplo Steve Jobs , eu posso sair da barra invertida ou ficar entre aspas, quando o caminho é o diretório local:

rsync Steve\ Jobs user@remote:/

ou

rsync "Steve Jobs" user@remote:/

No entanto, quando Steve Jobs é o diretório remoto, cercar aspas não é suficiente. Eu também tenho que fazer backslash para escapar do espaço:

rsync user@remote:/"Steve\ Jobs" .

Alguém sabe por que essa estranheza acontece?

Se isso é um artefato do SSH, por que o SSH apresenta essa esquisitice?

    
por mcandre 01.11.2015 / 18:51

1 resposta

2

rsync está passando a string entre aspas para a máquina remota. Se você escapa de um espaço entre aspas, então essa barra invertida se torna parte da string (não é comido pelo seu shell).

A % página de manual dorsync se refere ao escape:

If you need to transfer a filename that contains whitespace, you can either specify the --protect-args (-s) option, or you'll need to escape the whitespace in a way that the remote shell will understand. For instance:

CWrsync -av host:'file\ name\ with\ spaces' /dest

Você pode ver como os caracteres especiais são (ou não) comidos pelo shell usando um script simples como este:

#!/bin/sh
n=1
echo "$@"
for i in "$@"
do
    echo "$n:$i"
    n='expr $n + 1'
done

chamando isso args :

$ args "xx\ yy"; args "xx yy"
xx\ yy
1:xx\ yy
xx yy
1:xx yy

Como rsync não adiciona aspas (a menos que solicitado, usando -s ), os espaços devem ser manuseados especialmente quando enviados como parte de um comando shell para a outra máquina.

    
por 01.11.2015 / 19:05