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. 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, które 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ą powielane w oryginalnym pliku.

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ę working, a drugi latest. Katalog roboczy zawiera zestaw plików kodu źródłowego. Katalog latest 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 katalogu latest.

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 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.

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

Nazwa pliku poprawki jest dowolna. Możesz to nazwać, jak chcesz. Nadanie mu rozszerzenia „.patch” jest dobrym pomysłem, ponieważ wyjaśnia, jakiego typu jest to plik.

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żywamy opcji -u z diff, więc używamy opcji -u z patch.

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

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 patch o nazwie pliku poprawki do użycia:

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

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.

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 patch, 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 katalogu latest, 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 katalogu latest, 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

Zaglądanie do pliku poprawki

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

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

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.

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 patch, w którym katalogu ma pracować.

patch --dry-run -ruN -d working < slang.patch

Diff znalazł dwa pliki do załatania. Instrukcje dotyczące modyfikacji tych dwóch plików zostały sprawdzone przez patch, i nie zgłoszono żadnych problemów.

Kontrole przed wylotem są w porządku; jesteśmy gotowi do działania.

Patching a Directory

Aby naprawdę zastosować poprawki do plików, użyjemy poprzedniego polecenia bez opcji –dry-run.

patch -ruN -d working < slang.patch

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.


newsblog.pl