Tak, po prostu uruchom patchz --dry-runopcją, 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 -Ropcją, 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ć patchcałkowicie uciszyć przekierowując jego stdout i stderr do /dev/null)
To mi nie działa. Kiedy uruchomię to polecenie, jeśli łatka nie została zastosowana, pyta, czy „cofnąć” poprawkę w trybie interaktywnym, a jeśli użyję trybu wsadowego, zignoruje operację odwrotną i zastosuje łatkę, zwracając 0.
synack
1
Hej, spróbuj dodać -sfdo patch(można zapisać jako patch -Rsfp0 --dry-run)
poige
1
@synack, czy poszło dobrze?
poige
16
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
Nie, 0 jest poprawne. Łatka wyjdzie z niezerową, jeśli z jakiegoś powodu nie powiodło się uruchomienie na sucho, w którym to przypadku łatka nie powinna zostać zastosowana.
Fls'Zen,
Mój skrypt był poprawny w bash. bash uważa, że kod wyjścia 0 to truedla potrzeb if. Właśnie dlatego, że większość poleceń używa kodu wyjścia 0, aby wskazać powodzenie.
Wszechobecny
2
Oto przypuszczenie, zakładając, że korzystasz z patchnarzę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
Lub, jeśli załatałeś pliki wcześniej i chcesz wiedzieć, czy dotknął jakiegoś konkretnego pliku, możesz uruchomić pierwszą rundę łaty z -Bopcją, która spowodowałaby utworzenie kopii zapasowej. Następnie sprawdzasz, czy kopia zapasowa istnieje.
Peter
8
Czy mógłbyś nieco wyjaśnić, dlaczego zdecydowałeś się użyć nohupw takim ifprzypadku?
zrajm
@zrajm - Nie pamiętam, dlaczego to zrobiłem. I zanim zauważyłem (z powodu prośby o zatwierdzenie edycji), że już tam był, tak dawno temu nie ma szans, żebym kiedykolwiek odzyskał powód. Wydaje mi się, że patrzenie na to teraz zupełnie bez sensu.
Wszechobecny
0
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ć --forwardargumentu, a jeśli zostanie już zastosowany, pominie łatkę!
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:(Co więcej, we fragmencie powyżej możesz nawet chcieć
patch
całkowicie uciszyć przekierowując jego stdout i stderr do/dev/null
)źródło
-sf
dopatch
(można zapisać jakopatch -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:
źródło
1
zamiast0
: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ę:źródło
-B
opcją, która spowodowałaby utworzenie kopii zapasowej. Następnie sprawdzasz, czy kopia zapasowa istnieje.nohup
w takimif
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ę!źródło
To mi zadziałało.
źródło