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?
quelle
-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./
.a=$("rsync command")
. Dies würde den ausführenrsync
Befehl und speichertstdout
ina
. Dann können Sie Tests ama
| grep /
oder ähnliches hinzufügen und dann den Exit-Status von grep mit überprüfen.$?
Es sollte 1 sein, wenn keine Ausgabe vorhanden ist.Antworten:
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.
Möglicher Nachteil: Sie müssen die ausführliche Ausgabe verlieren, können sie jedoch jederzeit in einer Datei protokollieren.
quelle