
Я пишу скрипт резервного копирования для своей электронной почты и облачного сервиса.
Для простоты я разместил здесь только часть резервного копирования почты.
По сути, у меня есть Host-Machine с несколькими запущенными на нем Virtual Boxes.
Эти Virtual Boxes получают доступ к Host-Machine, /mnt/alias/storage/
где находится папка vmail (в моем случае она называется shishaMail)
(Далее может быть не нужная информация)
Я хотел бы сказать, что все внутри /mnt/alias/
— это ln -s
от /mnt/rack/*
с красивыми названиями.
В этой папке-стойке находятся крепления приводов.
(Необязательная информация КОНЕЦ)
Вот мой сценарий
#!/bin/bash
# backup script
BASEURL="/mnt/alias/backup"
MAILURL="/mnt/alias/storage/shishaMail"
DAY=`eval date +"%d"`
MONTH=`eval date +"%m"`
YEAR=`eval date +"%Y"`
HOUR=`eval date +"%H"`
MINUTE=`eval date +"%M"`
PIMPURL=$BASEURL/$YEAR/$MONTH/$DAY/
COMMAND1="cd $PIMPURL"
$COMMAND1 2>/dev/null
if [ $? -eq 0 ]
then
echo "Command 1 was successful"
else
echo "There ain't folders!!"
echo "I'll mkdir some!"
COMMAND2="mkdir -p $PIMPURL"
$COMMAND2 2>/dev/null
fi
if [ $? -eq 0 ]
then
echo 'Command 1 or/and 2 was successful'
echo "STARTING MAIL BACKUP"
COMMAND3="tar -cvzf '"$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz' "$MAILURL
echo $COMMAND3
$COMMAND3 2>/dev/null
if [ $? -eq 0 ]
then
echo 'MAIL BACKUP SUCCESSFULL'
else
echo "FAILURE!!"
fi
else
echo 'Nope! Must be some kind of strage Err0r!!'
fi
Итак, если я выполню этот скрипт, я получу следующую ошибку:
Команда 1 выполнена успешно
Команда 1 и/или 2 выполнены успешно
НАЧАЛО РЕЗЕРВНОГО КОПИРОВАНИЯ ПОЧТЫ
tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz' /mnt/alias/storage/shishaMail
tar: Удаление начальных `/' из имен элементов
tar (дочерний): '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz': Невозможно открыть: Такого файла или каталога нет
tar (дочерний): Ошибка неустранима: выход сейчас
СБОЙ!!
Как вы видите, есть echo
команда COMMAND3, которая будет выглядеть так:
tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_21_.data.tar.gz' /mnt/alias/storage/shishaMail
И если я выполняю эту команду вручную, как тот же пользователь, под которым я запускаю скрипт (который будет root в обоих случаях), это работает.
Я не понимаю, почему скрипт жалуется на несуществующий файл или каталог, поскольку каталоги существуют, за исключением файла, *.tar.gz
поскольку он должен быть создан tar
.
решение1
Попробуйте удалить одинарные кавычки из строки создания COMMAND3:
COMMAND3="tar -cvzf "$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz "$MAILURL
При выполнении этой строки вручную оболочка удаляет кавычки еще до того, как tar увидит аргументы.
Вы не вставляете пробелы в имя файла, поэтому кавычки не нужны. На самом деле, вы могли бы упростить эту строку еще немного:
COMMAND3="tar -cvzf ${PIMPURL}shisha_${HOUR}_${MINUTE}_.data.tar.gz ${MAILURL}"
Фигурные скобки нужны для разграничения имен переменных, иначе он попытается расширить 'PIMPURLshisha', что, вероятно, не то, что вам нужно. Никогда не повредит их использовать, так как это также выделяет переменные, их легче выбирать.