Por que meu tar em um script está se comportando de maneira diferente de usar tar manualmente

Por que meu tar em um script está se comportando de maneira diferente de usar tar manualmente

Estou escrevendo um script de backup para meu email e serviço de nuvem.
Para simplificar, postei apenas a parte do backup de e-mail aqui.

Basicamente, eu tenho uma máquina host com algumas caixas virtuais rodando nela.
Essas Caixas Virtuais acessam Host-Machines' /mnt/alias/storage/onde está a pasta vmail (chamada shishaMail no meu caso)

(Seguir pode não ser uma informação necessária)
Eu gostaria de dizer que tudo dentro /mnt/alias/é um ln -slugar /mnt/rack/*com nomes bonitos.
Nesta pasta do rack estão as montagens dos drives.
(Informação não necessária FIM)

Aqui está meu roteiro

#!/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

Então, se eu executar este script, recebo o seguinte erro:

O comando 1 foi bem-sucedido
O comando 1 ou/ou 2 foi bem-sucedido
STARTING MAIL BACKUP
tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz' /mnt/alias/storage/shishaMail
tar: Removendo `/' inicial dos nomes de membros
tar (filho): '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz': Não é possível abrir: Arquivo ou diretório tar (filho) inexistente
: Erro não é recuperável: saindo agora
FALHA!!

Como você pode ver, existe um echoCOMMAND3 que seria:

tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_21_.data.tar.gz' /mnt/alias/storage/shishaMail

E se eu executar esse comando manualmente, como o mesmo usuário que executo o script (que seria root em ambos os casos), ele funciona.
Não entendo por que o script reclama de um arquivo ou diretório inexistente, pois os diretórios existem, exceto o *.tar.gzarquivo, pois ele deve ser criado por tar.

Responder1

Tente remover as aspas simples da linha de criação do COMMAND3:

COMMAND3="tar -cvzf "$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz "$MAILURL

Quando você executa essa linha manualmente, o shell remove as aspas antes que o tar veja os argumentos.

Você não está inserindo espaços no nome do arquivo, portanto as aspas não são necessárias. Na verdade, você poderia simplificar um pouco mais essa linha:

COMMAND3="tar -cvzf ${PIMPURL}shisha_${HOUR}_${MINUTE}_.data.tar.gz ${MAILURL}"

As chaves servem para delimitar os nomes das variáveis, caso contrário, tentaria expandir 'PIMPURLshisha', provavelmente não o que você deseja. Nunca é demais usá-los, pois também fazem com que as variáveis ​​se destaquem e sejam mais fáceis de escolher.

informação relacionada