ошибка tar при включении dotfile

ошибка tar при включении dotfile

Мне нужно заархивировать несколько файлов, один из которых — dotfile.

FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml

FILES="${FILE1#/} ${FILE2#/}"

tar -C / -cf /tmp/foo/files.tar "$FILES"

Подстановка переменных позволяет избежать tar: Removing leading '/' from member namesпредупреждения и упрощает распаковку.

Но я получаю эту ошибку:

tar: tmp/foo/.env tmp/foo/docker-compose.yml: Невозможно получить статистику: Такого файла или каталога нет

Жесткое кодирование путей работает: tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml.

Я предполагаю, что проблема в обработке этого dotfile или в чем-то, связанном с экранированием?

решение1

При расширении оболочки "$FILES"пробел теряет свое синтаксическое значение. Поэтому tarкоманда принимается tmp/foo/.env tmp/foo/docker-compose.ymlкак единый путь.

Как только

file='a b'
touch "$file"

создаст файл a b, а не два файла aи b.

Итак, как предлагается в комментарии, вам следует использовать разные переменные для разных файлов: tar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}".


Тот факт, что прямой запуск tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.ymlработает, объясняется тем, что пробелы имеют там синтаксическое значение, отделяя один аргумент от другого. Для "человеческого глаза" тот же пробел будет получен после расширения в "$FILES", tmp/foo/.env tmp/foo/docker-compose.ymlно в этом случае пробел не имеет особого значения из-за кавычек, поэтому все значение будет рассматриваться как один путь.

Связанный контент