Как скрипты bash расширяют файловые глобусы?

524
vfclists

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

excludespec=$\_$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=$\_$USER\_`hostname`.bkcd_backup.$timestring.tar.gz  excludespec=$\_$USER\_`hostname`.bkcd_backup* fullexclude="$excludespec"tar.gz  echo excludespec - $excludespec echo filename - $filename echo fullexclude - $fullexclude  tar -cpzf $filename --exclude=$fullexclude . rm .bkcdspec 
0
Предполагая, что `/ bin / sh` указывает на` / bin / dash` (обычно это так), ваш скрипт не является скриптом * bash *, это скрипт * dash *. Dennis 11 лет назад 0
Вам не нужно [задавать один и тот же вопрос дважды] (http://stackoverflow.com/q/14425149/7552) glenn jackman 11 лет назад 1

1 ответ на вопрос

2
Nicole Hamilton

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