Jak zastosować poprawkę do pliku (i utworzyć poprawki) w systemie Linux

Polecenie łatki systemu Linux umożliwia szybkie i bezpieczne przenoszenie zmian z jednego zestawu plików do innego zestawu plików. Dowiedz się, jak w prosty sposób korzystać z łatki.

Polecenia dotyczące poprawek i różnic

Wyobraź sobie, że masz plik tekstowy na swoim komputerze. Otrzymujesz zmodyfikowaną wersję tego pliku tekstowego od kogoś innego. Jak szybko przenieść wszystkie zmiany ze zmodyfikowanego pliku do oryginalnego pliku? W tym miejscu do gry wchodzą poprawki i różnice. poprawki i różnice można znaleźć w systemie Linux i innych systemach operacyjnych typu Unix, takich jak macOS.

Polecenie diff sprawdza dwie różne wersje pliku i wymienia różnice między nimi. Różnice mogą być przechowywane w pliku zwanym plikiem poprawki.

Polecenie patch może odczytać plik poprawki i użyć jego zawartości jako zestawu instrukcji. Postępując zgodnie z tymi instrukcjami, zmiany w zmodyfikowanym pliku są powielone w oryginale plik.

Teraz wyobraź sobie, że ten proces zachodzi w całym katalogu plików tekstowych. Wszystko za jednym zamachem. To jest siła łatki.

Czasami nie otrzymujesz zmodyfikowanych plików. Wszystko, co otrzymasz, to plik poprawki. Po co wysyłać dziesiątki plików, skoro możesz wysłać jeden plik lub opublikować jeden plik w celu łatwego pobrania?

Co robisz z plikiem poprawki, aby faktycznie załatać swoje pliki? Oprócz tego, że prawie łamiemy język, jest to również dobre pytanie. W tym artykule przeprowadzimy Cię przez to.

Polecenie patch jest najczęściej używane przez osoby pracujące z plikami kodu źródłowego oprogramowania, ale działa równie dobrze z każdym zestawem plików tekstowych, niezależnie od ich przeznaczenia, kodu źródłowego lub nie.

Nasz przykładowy scenariusz

W tym scenariuszu znajdujemy się w katalogu o nazwie work, który zawiera dwa inne katalogi. Jeden nazywa się działającym, a drugi najnowszym. Katalog roboczy zawiera zestaw plików kodu źródłowego. Najnowszy katalog zawiera najnowszą wersję tych plików kodu źródłowego, z których niektóre zostały zmodyfikowane.

Ze względów bezpieczeństwa katalog roboczy jest kopią aktualnej wersji plików tekstowych. To nie jedyna ich kopia.

Znajdowanie różnic między dwiema wersjami pliku

Polecenie diff znajduje różnice między dwoma plikami. Jego domyślną akcją jest wyświetlenie zmodyfikowanych linii w oknie terminala.

Jeden plik nazywa się slang.c. Porównamy wersję w katalogu roboczym z wersją w najnowszym katalogu.

Opcja -u (zunifikowana) mówi diffowi, aby wyświetlał również niektóre niezmodyfikowane linie tekstu przed i po każdej ze zmienionych sekcji. Te linie nazywane są liniami kontekstu. Pomagają one poleceniu patch precyzyjnie zlokalizować miejsce, w którym należy wprowadzić zmianę w oryginalnym pliku.

Podajemy nazwy plików, aby diff wiedział, które pliki porównać. Oryginalny plik jest wyświetlany jako pierwszy, a następnie plik zmodyfikowany. To jest polecenie, które wydajemy, aby porównać:

diff -u working/slang.c latest/slang.c

diff -u working / slang.s latest / slang.c w oknie terminala

diff tworzy listę wyjściową pokazującą różnice między plikami. Gdyby pliki były identyczne, nie byłoby w ogóle listy wyników. Zobaczenie tego typu danych wyjściowych z diff potwierdza, że ​​istnieją różnice między dwiema wersjami plików i że oryginalny plik wymaga łatania.

wyjście z diff w oknie terminala

Tworzenie pliku łatek

Aby uchwycić te różnice w pliku poprawki, użyj następującego polecenia. To jest to samo polecenie, co powyżej, z wyjściem z diff przekierowanym do pliku o nazwie slang.patch.

diff -u working/slang.c latest/slang.c > slang.patch

diff -u working / slang.c latest / slang.c> slang.patch w oknie terminala ”width =” 646 ″ height = ”57 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<p> Nazwa pliku poprawki jest dowolna.  Możesz to nazwać, jak chcesz.  Nadanie mu rozszerzenia „.patch” jest dobrym pomysłem;  jednakże, ponieważ wyjaśnia, jakiego typu jest to plik. </p>
<p> Aby sprawić, że patch zadziała na plik z łatą i zmodyfikuje plik roboczy / slang.c, użyj następującego polecenia.  Opcja -u (zunifikowana) informuje patcha, że ​​plik poprawki zawiera ujednolicone linie kontekstu.  Innymi słowy, użyliśmy opcji -u z diff, więc używamy opcji -u z poprawką. </p>
<p> patch -u working.slang.c -i slang.patch </p>
<p> <img ładowanie =

Jeśli wszystko pójdzie dobrze, pojawi się pojedyncza linia danych wyjściowych z informacją, że patch naprawia plik.

Tworzenie kopii zapasowej oryginalnego pliku

Możemy poinstruować patch, aby wykonał kopię zapasową załatanych plików przed ich zmianą, używając opcji -b (kopia zapasowa). Opcja -i (wejście) informuje łatę o nazwie pliku poprawki do użycia:

patch -u -b working.slang.c -i slang.patch

patch -u working.slang.c -i slang.patch w oknie terminala

Plik jest załatany jak poprzednio, bez widocznych różnic w wynikach. Jeśli jednak zajrzysz do folderu roboczego, zobaczysz, że plik o nazwie slang.c.orig został utworzony. Znaczniki daty i czasu plików pokazują, że slang.c.orig to oryginalny plik, a slang.c to nowy plik utworzony przez patch.

wyjście ls w oknie terminala

Używanie diff z katalogami

Możemy użyć diff do stworzenia pliku łatki, który zawiera wszystkie różnice między plikami w dwóch katalogach. Możemy następnie użyć tego pliku poprawki z poprawką, aby te różnice zastosować do plików w folderze roboczym za pomocą jednego polecenia.

Opcje, których będziemy używać z diff to opcja -u (zunifikowany kontekst), której używaliśmy wcześniej, opcja -r (rekurencyjna), aby diff zajrzał do podkatalogów oraz opcja -N (nowy plik).

Opcja -N mówi diffowi, jak obsługiwać pliki w najnowszym katalogu, których nie ma w katalogu roboczym. Zmusza diff do umieszczenia instrukcji w pliku poprawki, tak aby patch utworzył pliki, które są obecne w najnowszym katalogu, ale ich brakuje w katalogu roboczym.

Możesz połączyć opcje razem, tak aby używały pojedynczego łącznika (-).

Zauważ, że podajemy tylko nazwy katalogów, nie mówimy diffowi, aby sprawdzał określone pliki:

diff -ruN working/ latest/ > slang.patch

diff -ruN working / latest /> slang.patch ”width =” 646 ″ height = ”77 ″ onload =” pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this); ”  onerror = ”this.onerror = null; pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon (this);”> </p>
<h2 role =Zaglądanie do pliku poprawki

Rzućmy okiem na plik poprawki. Będziemy używać mniej, aby przyjrzeć się jego zawartości.

less slang.patch w oknie terminala

W górnej części pliku widoczne są różnice między dwiema wersjami slang.c.

less slang.patch pokazujący górę pliku w oknie terminala

Przewijając dalej plik poprawki, widzimy, że opisuje on następnie zmiany w innym pliku o nazwie structs.h. To sprawdza, czy plik poprawki zdecydowanie zawiera różnice między różnymi wersjami wielu plików.

less slang.patch pokazujący środek pliku w oknie terminala

Rozejrzyj się zanim skoczysz

Poprawianie dużej kolekcji plików może być trochę denerwujące, więc użyjemy opcji –dry-run, aby sprawdzić, czy wszystko jest w porządku, zanim zdecydujemy się na wprowadzenie zmian.

Opcja –dry-run nakazuje patchowi robić wszystko oprócz faktycznej modyfikacji plików. patch przeprowadzi wszystkie kontrole plików przed lotem i jeśli napotka jakieś problemy, zgłosi je. Tak czy inaczej, żadne pliki nie są modyfikowane.

Jeśli nie zostaną zgłoszone żadne problemy, możemy powtórzyć polecenie bez opcji –dry-run i bez obaw załatać nasze pliki.

Opcja -d (katalog) informuje łatkę, w którym katalogu ma pracować.

Zauważ, że nie używamy opcji -i (wejście), aby powiedzieć patchowi, który plik poprawki zawiera instrukcje z diff. Zamiast tego przekierowujemy plik poprawki do poprawki z <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

patch --dry-run -ruN -d działa <slang.patch w oknie terminala

Out of the entire directory, diff found two files to patch. The instructions regarding the modifications for those two files have been checked by patch , and no problems have been reported.

Pre-flight checks are OK; we’re ready for take-off.

Patching a Directory

To genuinely apply the patches to the files we use the previous command without the --dry-run option.

patch -ruN -d working 

patch -ruN -d działa <slang.patch w oknie terminala

Tym razem każda linia wyjścia nie zaczyna się od „sprawdzania”, każda linia zaczyna się od „krosowania”.

Nie zgłoszono żadnych problemów. Możemy skompilować nasz kod źródłowy i będziemy korzystać z najnowszej wersji oprogramowania.

Wyrównaj swoje różnice

To zdecydowanie najłatwiejszy i najbezpieczniejszy sposób korzystania z łatki. Skopiuj pliki docelowe do folderu i załataj ten folder. Skopiuj je z powrotem, gdy będziesz zadowolony, że proces aktualizacji zakończył się bezbłędnie.