Почему мой tar в скрипте ведет себя иначе, чем при использовании tar вручную?

Почему мой tar в скрипте ведет себя иначе, чем при использовании tar вручную?

Я пишу скрипт резервного копирования для своей электронной почты и облачного сервиса.
Для простоты я разместил здесь только часть резервного копирования почты.

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

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