1

При обращении к путям с пробелами, например Steve Jobs , я могу либо экранировать обратную косую черту, либо заключить в кавычки, когда путь является локальным каталогом:

rsync Steve\ Jobs user@remote:/

или же

rsync "Steve Jobs" user@remote:/

Однако, когда Steve Jobs является удаленным каталогом, заключать в кавычки недостаточно. Я также должен убежать от косой черты:

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

Кто-нибудь знает, почему эта странность происходит?

Если это артефакт SSH, почему SSH представляет эту странность?

1 ответ1

2

rsync передает строку в кавычках на удаленный компьютер. Если вы избегаете пробела в кавычках, то обратный слеш становится частью строки (он не съедается вашей оболочкой).

Страница руководства rsync относится к экранированию:

Если вам нужно передать имя файла, содержащее пробелы, вы можете либо указать --protect-args (-s), либо вам нужно будет экранировать пробелы так, чтобы это понимала удаленная оболочка. Например:

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

Вы можете увидеть, как специальные символы (или нет) съедаются оболочкой, используя простой скрипт:

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

называя это args:

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

Поскольку rsync не добавляет кавычки (если их не спрашивают, используя -s), пробелы должны обрабатываться специально, когда они отправляются как часть команды оболочки на другую машину.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .