В этом коде переменная excludespec как ожидается, будет соответствовать всей ее подстроке, но она, по-видимому, оценивает фактические файлы, соответствующие ей при выполнении, а не передает ее точное представление команде tar, используя ее.

excludespec=${PWD##*/}\_$USER\_ имя хоста .bkcd_backup*

Конечный результат - создаваемый архив не соответствует списку исключений, поэтому вывод tar:

tar: .: file changed as we read it

Строка, определяющая это, делает что-то, о чем я не знаю?

Вот код:

#!/bin/sh
# bkcd - backup current directory in situ

DMY_M() {
  date +%Y%m%d_%H%M
}

timestring=$(DMY_M)
echo `pwd` - $timestring > .bkcdspec  
filename=${PWD##*/}\_$USER\_`hostname`.bkcd_backup.$timestring.tar.gz    
excludespec=${PWD##*/}\_$USER\_`hostname`.bkcd_backup*
fullexclude="$excludespec"tar.gz    
echo excludespec - $excludespec
echo filename - $filename
echo fullexclude - $fullexclude    
tar -cpzf $filename --exclude=$fullexclude .
rm .bkcdspec

1 ответ1

2

Подстановочные знаки выполняются после подстановки переменных. Чтобы вставить буквальное значение замещения, но не использовать подстановочные знаки, используйте двойные кавычки вокруг ссылки $var .

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