У меня есть следующий скрипт bash:
#DIR is something like: /home/foo/foobar/test/ without any whitespace but can also include whitespace
DIR="$( cd "$( dirname "$0" )" && pwd )"
#backup_name is read from a file
backup_name=FOOBAR
date=`date +%Y%m%d_%H%M_%S`
#subdirs is also read from the same file
subdirs=etc/ sbin/ bin/
filename="$DIR/Backup_$backup_name"_"$date.tar.gz"
cd /
echo "filename: $filename"
echo "subdirs $subdirs"
cmd='tar czvf "'$filename'" '$subdirs
echo "cmd tar: $cmd"
$cmd
Но я получаю следующий вывод:
filename: /home/foo/foobar/test/Backup_FOOBAR_20120322_1529_35.tar.gz
subdirs: etc/ sbin/ bin/
cmd tar: tar cfvz "/home/foo/foobar/test/Backup_FOOBAR_20120322_1529_35.tar.gz" etc/ sbin/ bin/
etc/
# ... list of files in etc
# but no files from sbin or bin directory
tar: "/home/foo/foobar/test/Backup_FOOBAR_20120322_1529_35.tar.gz": can open not execute: File or directory not found
tar: not recoverable error: abortion.
Однако, когда я копирую вывод echo команды tar, создаю cd/ и вставьте его в оболочку bash, в которой он работает:
tar cfvz "/home/foo/foobar/test/Backup_FOOBAR_20120322_1529_35.tar.gz" etc/ sbin/ bin/
etc/
- Каждая переменная определена, и нет завершающего символа новой строки
- Я также пробовал $ cmd с обратными чертами
- две переменные: backup_name и subdirs читаются из файла (я не включил процесс чтения в код)
edit: Я только что скопировал свой скриптв каталог без пробелов и изменил строку:
cmd='tar czvf "'$filename'" '$subdirs
#to
cmd="tar czvf $filename $subdirs"
, и теперь он работает, но когда я делаю то же самое в каталоге, который также содержит пробелы, я получаю все ту же ошибку.
edit2: чтение из файла (файл читается до того, как что-либо еще произойдет)
config="config.txt"
local line
while read line
do
#points to next free element and declares it
config_lines[${#config_lines[@]}]=$line
done <$config
backup_name=${config_line[0]}
subdirs=${config_line[1]}
Что не так с моим скриптом bash?