Действительно трудно получить переменную аргумента команды для работы с rsync. Поведение, которое я вижу, является этой ошибкой из сценария:

rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]

Однако скрипт выводит команду, которую он собирается запустить через эхо, и точно такая же копия команды, вставленная в терминал (или обратно в скрипт как первая строка с выходом после него), работает просто отлично!

Код сценария, который выполняет это rsync (check_flags в данном случае пуст):

rsync_cmd=(${check_flags} -rWltpgoDvdHP --delete-before -- \"${backup_dir}\" \"admin@nas-1:${backup_basename}/\")

echo "CMD to run: rsync ${rsync_cmd[@]}"

rsync ${rsync_cmd[@]}

Выход:

CMD to run: rsync -rWltpgoDvdHP --delete-before -- "/share/CACHEDEV1_DATA/veeam_backup_daily/Daily backup _@1am__1" "admin@nas-1:/share/CACHEDEV1_DATA/veeam_backup_daily/"

Я читал в Интернете, что использование массива должно помочь в этом вопросе, но это не так. Я уверен, что это легко исправить, но это сводит меня с ума!

1 ответ1

0

Оболочка анализирует кавычки перед тем, как заменить переменные, поэтому включение кавычек в значение переменной не дает ожидаемого результата (и echo сильно вводит в заблуждение, поскольку не показывает этого различия). Что вы должны сделать, это использовать неэкранированные кавычки при определении массива (чтобы они анализировались как разделители вокруг элементов массива, а не как часть значения массива), а затем заключать в кавычки ссылку на массив (так что это не слово- split или wildcard-раскрывают значения в массиве). Я бы также заменил команду echo на printf которая будет показывать, что будет происходить более точно:

rsync_cmd=(${check_flags} -rWltpgoDvdHP --delete-before -- "${backup_dir}" "admin@nas-1:${backup_basename}/")

printf "%q " CMD to run: rsync "${rsync_cmd[@]}"
printf "\n"

rsync "${rsync_cmd[@]}"

Обратите внимание, что printf может не показывать то, что вы ожидаете - он напечатает эквивалентное представление команды, которая будет выполнена, но есть много разных эквивалентных представлений каждого аргумента, и он выберет один на основе своих предпочтений, не так, как было изначально введено. Кстати, вы также можете использовать set -x для отладки подобных вещей, но (как и в случае printf "%q ") он может использовать другое представление, чем вы ожидаете.

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