Czy można wiedzieć, czy plik został już załatany, zanim zastosuje łatkę?
Muszę to zrobić w skrypcie, jakieś myśli?
Czy można wiedzieć, czy plik został już załatany, zanim zastosuje łatkę?
Muszę to zrobić w skrypcie, jakieś myśli?
Odpowiedzi:
Tak, po prostu uruchom patch
z --dry-run
opcją, albo się nie powiedzie, albo powiedzie się, co można sprawdzić na podstawie statusu wyjścia.
Ale w bardziej powszechny (i podatny na błędy) sposób prawdopodobnie musisz uruchomić go z -R
opcją, która oznacza „odwróć”, ponieważ tylko jeśli byłby w stanie cofnąć całą łatkę, można ją uznać za „zastosowaną”. W przeciwnym razie (bez „-R”) może się nie powieść z powodu zmiany niektórych części oryginalnego pliku. Poniżej znajduje się prosty przykład:
if ! patch -R -p0 -s -f --dry-run <patchfile; then
patch -p0 <patchfile
fi
(Co więcej, we fragmencie powyżej możesz nawet chcieć patch
całkowicie uciszyć przekierowując jego stdout i stderr do /dev/null
)
-sf
do patch
(można zapisać jako patch -Rsfp0 --dry-run
)
Na wypadek, gdyby komuś to pomogło, jeśli używasz skryptu bash, przykład podany przez Omnifariousa nie zadziałałby. W bashu status zakończony powodzeniem komendy wynosi 0
Więc działałyby następujące rzeczy:
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
zamiast 0
:if [ $? -eq 1 ]
true
dla potrzeb if. Właśnie dlatego, że większość poleceń używa kodu wyjścia 0, aby wskazać powodzenie.
Oto przypuszczenie, zakładając, że korzystasz z patch
narzędzia, a każdy plik do załatania ma własną łatkę:
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
opcją, która spowodowałaby utworzenie kopii zapasowej. Następnie sprawdzasz, czy kopia zapasowa istnieje.
nohup
w takim if
przypadku?
W moim przypadku chciałem to sprawdzić, aby uruchomienie komendy patch nie zakończyło się interaktywnym terminalem z pytaniem, co robić (szczególnie dla CI).
Okazuje się, że jeśli potrzebujesz, możesz także użyć --forward
argumentu, a jeśli zostanie już zastosowany, pominie łatkę!