Warum verhält sich mein Tar in einem Skript anders als bei manueller Verwendung von Tar?

Warum verhält sich mein Tar in einem Skript anders als bei manueller Verwendung von Tar?

Ich schreibe ein Backup-Skript für meinen E-Mail- und Cloud-Dienst.
Der Einfachheit halber habe ich hier nur den Mail-Backup-Teil gepostet.

Im Grunde habe ich eine Host-Maschine, auf der einige virtuelle Boxen laufen.
Diese virtuellen Boxen greifen auf Host-Maschinen zu, /mnt/alias/storage/auf denen sich der vmail-Ordner befindet (in meinem Fall shishaMail genannt).

(Die folgenden Informationen sind möglicherweise nicht erforderlich)
Ich möchte sagen, dass alles darin ein Formular mit hübschen Namen /mnt/alias/ist . In diesem Rack-Ordner befinden sich die Halterungen der Laufwerke.ln -s/mnt/rack/*

(Nicht notwendige Informationen, ENDE)

Hier ist mein Skript

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

Wenn ich dieses Skript ausführe, erhalte ich die folgende Fehlermeldung:

Befehl 1 war erfolgreich.
Befehl 1 und/oder 2 war erfolgreich.
E-Mail-Sicherungskopie wird gestartet.
tar -czvf „/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz“ /mnt/alias/storage/shishaMail
tar: Entfernen des führenden „/“ aus den Mitgliedsnamen
tar (untergeordnet): „/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz“: Kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis
tar (untergeordnet): Fehler nicht behebbar: Beenden jetzt
. FEHLER!!

Wie Sie sehen, gibt es einen Befehl echovom Typ COMMAND3, der wie folgt lauten würde:

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

Und wenn ich diesen Befehl manuell ausführe, als derselbe Benutzer, als der ich das Skript ausführe (was in beiden Fällen root wäre), funktioniert es.
Ich verstehe nicht, warum das Skript sich über eine nicht vorhandene Datei oder ein nicht vorhandenes Verzeichnis beschwert, da die Verzeichnisse außer der Datei existieren, *.tar.gzda diese von erstellt werden muss tar.

Antwort1

Versuchen Sie, die einfachen Anführungszeichen aus der COMMAND3-Erstellungszeile zu entfernen:

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

Wenn Sie diese Zeile manuell ausführen, entfernt die Shell die Anführungszeichen, bevor Tar die Argumente jemals sieht.

Sie fügen keine Leerzeichen in den Dateinamen ein, daher sind Anführungszeichen nicht erforderlich. Tatsächlich könnten Sie diese Zeile noch etwas vereinfachen:

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

Die geschweiften Klammern dienen zur Abgrenzung der Variablennamen, andernfalls würde versucht, „PIMPURLshisha“ zu erweitern, was wahrscheinlich nicht das ist, was Sie wollen. Es schadet nie, sie zu verwenden, da Variablen dadurch auch hervorgehoben werden und leichter zu erkennen sind.

verwandte Informationen