Wie kann ich überprüfen, ob rsync Änderungen an bash vorgenommen hat?

12

Ich habe ein Skript, das rsync verwendet, um Daten in einem entfernten -> lokalen Szenario zu synchronisieren. Unmittelbar nach dem Ausführen des Befehls rsync wird überprüft, ob der Fehlercode gleich Null ist oder nicht. Wenn es Null ist, werden weitere Befehle ausgeführt. Dies berücksichtigt jedoch nicht die Tatsache, dass rsync möglicherweise erfolgreich ausgeführt wurde, aber tatsächlich keine Änderungen vorgenommen hat. Aus diesem Grund wird die Bedingung "Gleich Null" unabhängig davon ausgeführt, was etwas redundant ist.

rsync -aEivm --delete /path/to/remote/ /path/to/local/

if [ $? -eq 0 ]; then
    # Success do some more work!
else
    # Something went wrong!
    exit 1;
fi

Was wäre der beste Ansatz, um dies zu erweitern und zu überprüfen, ob tatsächlich Änderungen basierend auf dem ausgeführten Befehl rsync vorgenommen wurden. Ich habe gelesen, dass das Flag -i die Ausgabe an stdout liefern kann, aber wie kann dies in einem bedingten Block platziert werden?

James White
quelle
Sie sind dort angekommen -v, sodass es bereits die Informationen enthält, die Sie zum Stdout benötigen ... z. B. eine Liste der Dateien, die tatsächlich gesendet wurden. Wenn sich nichts ändert, ist das einfach ./.
Goldlöckchen
Ah! Was ist, wenn ich -v herausnehme und stattdessen -i verwende und dann eine nicht leere Zeichenfolgenprüfung für den Befehl rsync verwende?
James White
Sieht so aus, als hätten Sie die Lösung selbst gefunden? :-)
Björn Munch
2
Sie können verwenden a=$("rsync command"). Dies würde den ausführen rsyncBefehl und speichert stdoutin a. Dann können Sie Tests ama
nitishch
1
Sie können auch ein | grep /oder ähnliches hinzufügen und dann den Exit-Status von grep mit überprüfen. $?Es sollte 1 sein, wenn keine Ausgabe vorhanden ist.
Björn Munch

Antworten:

9

Stellen Sie basierend auf den Kommentaren zu meiner ursprünglichen Frage die rsync-Ausgabe mit dem Flag -i auf stdout und verwenden Sie eine Nicht-Zeichenfolgenprüfbedingung, um festzustellen, ob sich innerhalb der Fehlercodeprüfung tatsächlich etwas geändert hat. Wenn Sie den Befehl rsync in eine Variable einschließen, kann die Überprüfung durchgeführt werden.

RSYNC_COMMAND=$(rsync -aEim --delete /path/to/remote/ /path/to/local/)

    if [ $? -eq 0 ]; then
        # Success do some more work!

        if [ -n "${RSYNC_COMMAND}" ]; then
            # Stuff to run, because rsync has changes
        else
            # No changes were made by rsync
        fi
    else
        # Something went wrong!
        exit 1
    fi

Möglicher Nachteil: Sie müssen die ausführliche Ausgabe verlieren, können sie jedoch jederzeit in einer Datei protokollieren.

James White
quelle