LINUX.ORG.RU

rsync и rsync-path

 


0

2

Пишу скрипт бэкапа на основе rsync.

В процессе написания потребовалось предварительно создавать каталог в пункте назначения - как раз для этого подходит параметр rsync-path.

Однако, как выяснилось, этот параметр требует особого синтаксиса (содержит кавычки) и исходя из того, как шелл разбирает синтаксис - я не могу «забрать» этот параметр в переменную содержащую аргументы rsync`а или свернуть как-то ещё (подставлять этот параметр по условию.

В итоге я обязан писать этот параметр руками или в скрипте ЯВНО. Теперь вопрос:

Существует-ли метод обхода для «особого синтаксиса» параметра rsync-path? Или это приговор?

rsync --rsync-path="mkdir ... && rsync" ${args[@]}
★★

Я ничего не понял.

$ RSYNC_PATH="\"mkdir ... && rsync\""
$ echo rsync --rsync-path=$RSYNC_PATH
rsync --rsync-path="mkdir ... && rsync"
$ RSYNC_PATH='"mkdir ... && rsync"'
$ echo rsync --rsync-path=$RSYNC_PATH
rsync --rsync-path="mkdir ... && rsync"
t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от t184256

А выполнить-то ты пробовал?

Нет проблемы в том, чтобы экранировать кавычки и подсунуть это rsync`у.

Проблема в том, что такая команда НЕ РАБОТАЕТ.

Попробуй выполнить

rsync --rsync-path="mkdir ... && rsync" ${args[@]}
и
rsync ${args[@]}
Где «--rsync-path=\"mkdir ... && rsync\"» включён в args.

Первый вариант работает, а второй нет.

zzdnx ★★
() автор топика
Последнее исправление: zzdnx (всего исправлений: 3)
Ответ на: комментарий от t184256

Чисто логически

Нужно всего-то экранировать кавычки.

Если этого мало - экранировать амперсанды.

Других спец-символов (если не считать пути) - нет.

Должно работать, но не работает. Подробнее: http://www.scriptscoop.net/t/71fc79314eee/bash-random-single-quotes-being-add... - у спрашивавшего там юзера такая же проблема как у меня. Вот мой предыдущий вопрос на эту же тему: Rsync, SSH и Expext

zzdnx ★★
() автор топика
Последнее исправление: zzdnx (всего исправлений: 1)
Ответ на: комментарий от deadNightTiger

Чем bash не нормальный?

Хотя это не ЯП, но всё же...

zzdnx ★★
() автор топика
Ответ на: комментарий от anonymous

В оригинале я не пихаю всё в переменную args.

У меня код вида:

rsync `
if [ $ssh == "yes" ]
then 
  echo "  --rsync-path=\"mkdir ... && rsync\"  "
fi
` ${args[@]}
Но этот код не работает по причине, описанной выше - неправильный разбор кавычек.

zzdnx ★★
() автор топика
Ответ на: комментарий от deadNightTiger

--foo="a b c" и "--foo=a b c" - одно и то же.

Я специально добивался того, чтобы вывод команды echo показывал мне именно ту команду, которую я набираю в терминале:

rsync --rsync-path="mkdir -p $DST/Processing-$date && rsync" -axpz --delete --link-dest=../Latest --numeric-ids ~/ToBackup/ netuser@server:$DST/Processing-$date
Проверив, что вывод команды echo в точности соответствует исполняемой команде я пытаюсь выполнить скрипт. С кавычками, как видно, всё нормально и команда должна была выполниться, или я не прав?

zzdnx ★★
() автор топика
Ответ на: --foo="a b c" и "--foo=a b c" - одно и то же. от zzdnx

echo как раз не должен показывать кавычки. Для этого лучше использовать printf "%s\n" - тогда отдельные аргументы будут на отдельных строчках. Т.е., например

$ printf "%s\n" rsync "`echo --rsync-path=mkdir -p a \&\& rsync`" blabla
Но лучше все же не использовать баш на таких задачах. К примеру, на питоне с модулем sh:
from sh import rsync
rsync("--rsync-path=mkdir -p a && rsync", "blabla")
и никаких проблем с экранированием.

deadNightTiger ★★★★★
()
Ответ на: комментарий от deadNightTiger

echo как раз не должен показывать кавычки.

Даже если они экранированы? За совет с printf благодарю, буду использовать его для отладки.

...лучше все же не использовать баш на таких задачах.

Вот с этим как раз беда - по суловиям ТЗ мой скрипт должен работать на большинстве систем без установки дополнительных пакетов или обновления существующих.

К примеру, на питоне с модулем sh

Питон (в отличии от баш/сш) есть не везде, да и знаю я его чуть менее, чем никак...

Как я понимаю, средствами (ba)sh передать rsync`у параметр --rsync-path="mkdir -p $DST/Processing-$date && rsync" нет никакой возможности, потому что при разборе интерпретатором столь необходимые данному параметру кавычки будут отброшены и логическое И создаст неожиданный конец строки, что нарушит синтаксис компнды rsync.

zzdnx ★★
() автор топика

mkdir --parents

anonymous
()
Ответ на: комментарий от deadNightTiger

...кавычки нужны башу, а не рсинку?

На этот код:

param="--rsync-path=mkdir -p $DST/Processing-$date && rsync"
rsync "$param"
... мне выдаётся ошибка.

Вообще, в моей ситуации есть 2 варианта ошибки:

1) нежданная кавычка
2) нежданный конец строки
Первая появляется от экранированых кавычек, а вторая от неэкранированного оператора «&&».

Более того, разве bash не развернёт rsync "$param" до полной строки: rsync "--rsync-path=mkdir -p $DST/Processing-$date && rsync", то есть до rsync --rsync-path=mkdir -p $DST/Processing-$date && rsync, где логическое И образует неожиданный для первого rsync`а конец строки?

zzdnx ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.