Ist es möglich zu wissen, ob eine Datei bereits gepatcht wurde, bevor der Patch angewendet wird?
Muss ich das in einem Skript machen, irgendwelche Gedanken?
Ist es möglich zu wissen, ob eine Datei bereits gepatcht wurde, bevor der Patch angewendet wird?
Muss ich das in einem Skript machen, irgendwelche Gedanken?
Antworten:
Ja, nur patchmit der --dry-runOption ausführen , es würde entweder fehlschlagen oder erfolgreich sein, was anhand des Beendigungsstatus festgestellt werden kann.
Aber auf häufigere (und fehleranfällige) Weise müssen Sie es wahrscheinlich mit der -ROption ausführen, die "Umkehren" bedeutet, da es nur dann als "angewendet" angesehen werden kann, wenn es in der Lage ist, den gesamten Patch zurückzusetzen. Andernfalls (ohne '-R') könnte es fehlschlagen, nur weil einige Teile der Originaldatei geändert wurden. Unten ist ein einfaches Beispiel:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Im obigen Snippet ziehen Sie es sogar vor, die Stille zu aktivieren, indem Sie patchstdout und stderr auf vollständig umleiten. /dev/null)
-sfmit patch(kann geschrieben werden als patch -Rsfp0 --dry-run)
Nur für den Fall, dass es jemandem hilft, wenn Sie ein Bash-Skript verwenden, funktioniert das von Omnifarious gegebene Beispiel nicht. In der Bash ist der Exit-Status eines erfolgreichen Befehls 0
Also würde folgendes funktionieren:
patch -p0 -N --dry-run --silent < patchfile 2>/dev/null
#If the patch has not been applied then the $? which is the exit status
#for last command would have a success status code = 0
if [ $? -eq 0 ];
then
#apply the patch
patch -p0 -N < patchfile
fi
1stattdessen erfolgen 0:if [ $? -eq 1 ]
truefür die Zwecke von if. Gerade weil die meisten Befehle einen Exit-Code von 0 verwenden, um den Erfolg anzuzeigen.
Angenommen, Sie verwenden das patchDienstprogramm und jede zu patchende Datei verfügt über einen eigenen Patch:
if patch <options> -N --dry-run --silent <patchfile 2>/dev/null; then
echo The file has not had the patch applied,
echo and the patch will apply cleanly.
else
echo The file may not have had the patch applied.
echo Or maybe the patch doesn't apply to the file.
fi
-BOption ausführen , durch die eine Sicherung durchgeführt wird. Dann prüfen Sie, ob die Sicherung vorhanden ist.
nohupdiesen ifFall entschieden haben?
In meinem Fall wollte ich diese Überprüfung durchführen, damit beim Ausführen des Patch-Befehls nicht ein interaktives Terminal gefragt wird, was zu tun ist (insbesondere für CI).
Es stellt sich heraus, dass Sie, wenn Sie nur das benötigen, auch das --forwardArgument verwenden können und den Patch überspringen, wenn er bereits angewendet wurde!