Por que meu tar em um script está se comportando de forma diferente do que usar tar manualmente?

2

Estou escrevendo um script de backup para o meu serviço de e-mail e nuvem.
Para simplificar, eu só publiquei a parte de backup de email aqui.

Basicamente, eu tenho uma máquina host com algumas caixas virtuais sendo executadas nela. Essas Caixas Virtuais acessam o arquivo% ma_de% das Máquinas-Host, onde existe a pasta vmail (chamada shishaMail no meu caso)

(A seguir pode não ser necessária informação)
Eu gostaria de dizer que tudo dentro de /mnt/alias/storage/ é um /mnt/alias/ de ln -s com nomes bonitos.
Nesta pasta de rack são as montagens das unidades.
(Não é necessário informações END)

Aqui está o meu script

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

Command 1 was successful
Command 1 or/and 2 was successful
STARTING MAIL BACKUP
tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz' /mnt/alias/storage/shishaMail
tar: Removing leading '/' from member names
tar (child): '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz': Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
FAILURE!!

Como você vê, há um /mnt/rack/* de COMMAND3 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 eu executar o script como (que seria root em ambos os casos), ele funcionará.
Eu não entendo porque o script reclama sobre um arquivo ou diretório não existente, já que os diretórios existem, exceto o arquivo echo , já que isso tem que ser criado por *.tar.gz .

    
por Harrys Kavan 13.06.2014 / 10:41

1 resposta

3

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, aspas não são necessárias. Na verdade, você poderia simplificar mais essa linha:

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

As chaves são para delimitar os nomes das variáveis, caso contrário, tentar expandir 'PIMPURLshisha', provavelmente não é o que você deseja. Nunca é demais usá-las, pois faz com que as variáveis se destaquem também, mais fáceis de entender.

    
por 13.06.2014 / 11:39