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 patch
mit der --dry-run
Option 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 -R
Option 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 patch
stdout und stderr auf vollständig umleiten. /dev/null
)
-sf
mit 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
1
stattdessen erfolgen 0
:if [ $? -eq 1 ]
true
für die Zwecke von if. Gerade weil die meisten Befehle einen Exit-Code von 0 verwenden, um den Erfolg anzuzeigen.
Angenommen, Sie verwenden das patch
Dienstprogramm 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
-B
Option ausführen , durch die eine Sicherung durchgeführt wird. Dann prüfen Sie, ob die Sicherung vorhanden ist.
nohup
diesen if
Fall 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 --forward
Argument verwenden können und den Patch überspringen, wenn er bereits angewendet wurde!