¿Por qué mi tar en un script se comporta de manera diferente que usar tar manualmente?

¿Por qué mi tar en un script se comporta de manera diferente que usar tar manualmente?

Estoy escribiendo un script de respaldo para mi correo electrónico y servicio en la nube.
Para simplificar, solo publiqué aquí la parte de la copia de seguridad del correo.

Básicamente, tengo una máquina host con algunas cajas virtuales ejecutándose en ella.
Estas Virtual Boxes acceden a las Host-Machines /mnt/alias/storage/donde está la carpeta vmail (llamada shishaMail en mi caso)

(Es posible que la siguiente información no sea necesaria)
Me gustaría decir que todo lo que hay dentro /mnt/alias/es una ln -scasa /mnt/rack/*con nombres bonitos.
En esta carpeta de rack se encuentran los soportes de las unidades.
(Información no necesaria FIN)

Aquí está mi guión

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

Entonces, si ejecuto este script, aparece el siguiente error:

El comando 1 fue exitoso
El comando 1 y/o 2 fue exitoso
INICIANDO LA COPIA DE SEGURIDAD DEL CORREO
tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz' /mnt/alias/storage/shishaMail
tar: Eliminando `/' inicial de los nombres de miembros
tar (secundario): '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz': No se puede abrir: no existe tal archivo o directorio
tar (secundario): Error no es recuperable: salir ahora ¡
¡FALLO!!

Como veis hay un echode COMMAND3 que sería:

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

Y si ejecuto este comando a mano, como el mismo usuario con el que ejecuto el script (que sería root en ambos casos), funciona.
No entiendo por qué el script se queja de que no existe un archivo o directorio, ya que los directorios existen excepto el *.tar.gzarchivo, ya que este debe ser creado por tar.

Respuesta1

Intente eliminar las comillas simples de la línea de creación de COMMAND3:

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

Cuando ejecuta esa línea a mano, el shell elimina las comillas antes de que tar vea los argumentos.

No estás insertando espacios en el nombre del archivo, por lo tanto, las comillas no son necesarias. En realidad, podrías simplificar esa línea un poco más:

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

Las llaves sirven para delimitar los nombres de las variables; de lo contrario, intentaría expandir 'PIMPURLshisha', probablemente no sea lo que desea. Nunca está de más usarlos, ya que también hacen que las variables se destaquen y sean más fáciles de seleccionar.

información relacionada