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

Скрипт строит и выполняет команду:

/usr/bin/attic create --stats --verbose --exclude '/home/.cache' /media/attic-backup/paolo.attic::2016-08-27 /home

команда выводит файлы, скопированные с чердака:

/home
/home/.attic
/home/.attic/keys
/home/.cache
/home/git
/home/git/.bash_history
etc etc

/home/.cache должен быть пропущен ...

Однако, если я выполняю ту же команду из терминала, я получаю:

$ /usr/bin/attic create --stats --verbose --exclude '/home/.cache' /media/attic-backup/paolo.attic::2016-08-27 /home
/home
/home/.attic
/home/.attic/keys
/home/git
/home/git/.bash_history
etc etc

Теперь каталог /home/.cache пропущен.

Это не вопрос судо.

Почему команда в скрипте ведет себя иначе?

1 ответ1

1

Когда вы говорите, что скрипт "строит" команду, вы имеете в виду, что он сохраняет ее в виде строки (переменной), а затем пытается выполнить строку как команду? Если это так, то размещение кавычек внутри строки ('/home/.cache') не будет соответствовать вашим ожиданиям, поскольку кавычки обрабатываются как данные и передаются команде как часть аргумента, а не анализируются и удаляются перед это передано в качестве аргумента. По сути, это означает, что rsync велел исключить '/home/.cache' а не только /home/.cache . Смотрите BashFAQ # 50: я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу! для получения дополнительной информации.

Если вы пытаетесь собрать команду по частям, обычно лучший способ сделать это - использовать массив. Что-то вроде этого:

atticcmd=(/usr/bin/attic create --stats --verbose --exclude '/home/.cache' /media/attic-backup/paolo.attic::2016-08-27 /home)
"${atticcmd[@]}"

Или вы можете построить только часть этого в массиве:

atticopts=(--stats --verbose)
for e in "${excludes[@]}"; do
    atticopts+=(--exclude "$e")
done
/usr/bin/attic create "${atticopts[@]}" /media/attic-backup/paolo.attic::2016-08-27 /home

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