
Мне нужно заархивировать несколько файлов, один из которых — 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
но в этом случае пробел не имеет особого значения из-за кавычек, поэтому все значение будет рассматриваться как один путь.