Одним из методов, который я считаю неоценимым, является использование позиционных параметров, облегчающих работу со списком параметров.
Когда вы помещаете опции внутри переменной (например, переменную OPTIONS
), вам нужно найти способ включения кавычек внутри значения и опускать кавычки при ссылке на переменную. Он работает, но вы всегда остаетесь в стороне от сложного отладки.
Вместо этого попробуйте следующее.
set -- -Cavz --delete
set -- "[email protected]" --exclude "file.php"
set -- "[email protected]" "dist_serv:~/www/"
set -- "[email protected]" "~/www/"
rsync "[email protected]"
Конечно, в этом случае, все могло бы быть на той же линии, но и во многих случаях будет условные выражения, так что, например, вы можете пропустить данную опцию, или выбрать разностные файлы для работы с. Самое приятное, что вы всегда используете ту же цитату, которую будете использовать в одной командной строке, все благодаря магии "[email protected]"
, которая позволяет не ссылаться (или не указывать) какую-либо конкретную переменную.
Если фактические позиционные параметры мешают, вы можете поместить их в переменные или создать функцию, чтобы изолировать контекст, который позволяет не трогать их там, где они имеют значение.
Я использую этот трюк все время, и я прекратил вытягивать волосы из-за цитирования, вызывающего проблемы внутри значений, которые я передаю как параметр командам.
Аналогичный результат можно достичь, используя массив.
declare -a ARGUMENTS=()
ARGUMENTS=(-Cavz --delete)
ARGUMENTS+=(--exclude "file.php")
ARGUMENTS+=("dist_serv:~/www/")
ARGUMENTS+=("~/www/")
rsync "${ARGUMENTS[@]}"
переменная OPTIONS не может быть заключено в кавычки, потому что она содержит два слова, и цитирование предотвратит их от раскола при интерпретации команды (они будут рассматриваться как одна строка). В этом случае не цитирование OPTIONS будет работать, потому что оно не содержит пробелов, но это не общее решение. – Fred
да, конечно, переменное назначение! Редактирование моего вопроса ... – mrtnmgs
@immicile Если бы вы могли также упомянуть точное сообщение об ошибке, которое вы получаете от 'rsync' в вопросе, это очень помогло бы! – Kusalananda