Бьется головой об стену с этим. Я использую сценарий bash для чтения файла имен каталогов (по одному имени в строке, без экранированных символов) в переменную и использую эту переменную для вызова tar в этих каталогах. Если в одном из каталогов есть пробел, я не могу правильно передать его в tar (продолжает разделять его на два отдельных элемента, не сохраняя экранирование, которое я добавляю). Я попробовал много вариантов этого, но ниже это самый актуальный. Действительно разочаровывающая часть: echo показывает, что команда принимает точную форму, которую я ожидал, и работает, которая работает вручную, как и ожидалось. Заранее спасибо за помощь.
скрипт bash
#!/bin/bash
#build list of directories to backup from backup_dirs.txt
BACKUP_DIRS=
while read dir; do
#create escaped version of string to handle spaces, etc...
esc_line=$(printf '%q' "${dir}")
echo "###### adding dir '${esc_line}'"
#add new dire to list
BACKUP_DIRS=${BACKUP_DIRS}\ "${esc_line}"
done < backup_dirs.txt
echo tar -cjvPf backup.tar.bz2 ${BACKUP_DIRS}
#run backup
tar -cjvPf backup.tar.bz2 ${BACKUP_DIRS}
образец содержимого backup_dirs.txt
my_stuff
My Stuff
наблюдаемый результат
###### adding dir 'my_stuff'
###### adding dir 'My\ Stuff'
tar -cjvPf backup.tar.bz2 my_stuff My\ Stuff
my_stuff/
tar: My\\: Cannot stat: No such file or directory
tar: Stuff: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors