Linux Patch: Enkel guide til å fikse filer

Linux-kommandoen patch gir deg en effektiv og sikker måte å overføre endringer fra én filgruppe til en annen. La oss utforske hvordan du enkelt kan bruke patch.

Forstå kommandoene patch og diff

Se for deg at du har en tekstfil på datamaskinen din. Du mottar en
oppdatert versjon av denne filen fra en annen person. Hvordan kan du raskt
overføre alle modifikasjonene fra den endrede filen til den originale? Det er
her patch og diff kommer inn. Disse kommandoene er
tilgjengelige i Linux og andre Unix-baserte systemer, som macOS.

diff-kommandoen analyserer
to ulike versjoner av en fil
og identifiserer forskjellene. Disse forskjellene kan lagres i en
patch-fil.

patch-kommandoen leser patch-filen og tolker
innholdet som en rekke instruksjoner. Ved å følge disse instruksjonene blir
endringene fra den modifiserte filen
implementert i den originale filen.

Tenk deg nå at denne prosessen skjer med en hel mappe full av tekstfiler, alt
på en gang. Dette er kraften i patch.

Noen ganger mottar du ikke de endrede filene, men kun en
patch-fil. Hvorfor sende mange filer når man kan sende én enkelt
fil eller legge ut én fil for enkel nedlasting?

Hvordan bruker du denne patch-filen til å oppdatere filene
dine? Dette skal vi gå gjennom i denne artikkelen.

Selv om patch ofte brukes av programvareutviklere, kan den
brukes med hvilke som helst tekstfiler, uansett formål.

Vårt eksempel

I dette eksemplet jobber vi i en mappe kalt «work», som inneholder to
undermapper: «working» og «latest». «working»-mappen inneholder et sett med
kildekodefiler, mens «latest»-mappen inneholder de nyeste versjonene av disse
filene, hvorav noen er endret.

For ordens skyld er «working»-mappen en kopi av gjeldende versjon av
tekstfilene. Det er ikke den eneste kopien.

Identifisere forskjeller mellom filversjoner

diff-kommandoen identifiserer forskjellene mellom to filer.
Standardfunksjonen er å vise de modifiserte linjene i terminalen.

Vi har en fil som heter «slang.c». Vi sammenligner versjonen i
«working»-mappen med den i «latest»-mappen.

Med alternativet «-u» (unified), instruerer vi diff til å vise
noen av de uendrede linjene før og etter de endrede seksjonene. Disse
linjene, kalt kontekstlinjer, hjelper patch med å finne nøyaktig
hvor endringene skal gjøres i originalfilen.

Vi oppgir filnavnene slik at diff vet hvilke filer som skal
sammenlignes. Originalfilen kommer først, etterfulgt av den endrede filen.
Her er kommandoen vi bruker:

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

diff genererer en utdataliste som viser forskjellene mellom
filene. Hvis filene var identiske, ville det ikke vært noen utdata. Å se
denne utdataen bekrefter at det er forskjeller mellom filversjonene, og at
originalfilen må oppdateres.

Opprette en patch-fil

For å lagre disse forskjellene i en patch-fil, bruker vi
følgende kommando. Det er den samme kommandoen som tidligere, men vi omdirigerer
utdataen til en fil som heter «slang.patch».

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

Navnet på patch-filen er valgfritt. Du kan gi den et hvilket som
helst navn. Det er imidlertid lurt å gi den filendelsen «.patch» slik at det
er tydelig hva slags fil det er.

For å få patch til å bruke patch-filen og endre
«working/slang.c»-filen, bruker vi denne kommandoen. Alternativet «-u»
informerer patch om at patch-filen inneholder
enhetlige kontekstlinjer. Med andre ord, siden vi brukte «-u»-alternativet med
diff, må vi også bruke «-u»-alternativet med
patch.

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

Hvis alt går som det skal, vil du se en linje med utdata som bekrefter at
patch oppdaterer filen.

Sikkerhetskopiere originalfilen

Vi kan instruere patch til å lage en sikkerhetskopi av filene
før de endres, ved å bruke «-b» (backup)-alternativet. Alternativet «-i»
(input) gir patch navnet på patch-filen som skal
brukes:

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

Filen blir oppdatert som før, uten noen synlig forskjell i utdataen. Men
hvis du ser inni «working»-mappen, ser du at filen «slang.c.orig» er
opprettet. Dato- og tidsstemplene til filene viser at «slang.c.orig» er den
originale filen, mens «slang.c» er en ny fil opprettet av
patch.

Bruke diff med kataloger

Vi kan bruke diff til å lage en patch-fil som
inneholder alle forskjellene mellom filene i to kataloger. Denne
patch-filen kan deretter brukes med patch for å
implementere disse forskjellene i filene i «working»-mappen, med en enkelt
kommando.

Alternativene vi skal bruke med diff er «-u» (enhetlig
kontekst), «-r» (rekursiv) for å få diff til å se inn i alle
undermapper, og «-N» (ny fil).

«-N»-alternativet forteller diff hvordan den skal håndtere filer
i «latest»-mappen som ikke finnes i «working»-mappen. Den tvinger
diff til å inkludere instruksjoner i patch-filen,
slik at patch oppretter filer som finnes i «latest»-mappen, men
som mangler i «working»-mappen.

Du kan kombinere alternativene slik at de bruker en enkelt bindestrek (-).

Merk at vi kun oppgir katalognavnene; vi ber ikke diff om å se
på spesifikke filer:

diff -ruN working/ latest/ > slang.patch

Se inn i patch-filen

La oss ta en rask titt på patch-filen. Vi bruker less for å se på innholdet.

Øverst i filen ser vi forskjellene mellom de to versjonene av «slang.c».

Når vi skroller lenger ned i patch-filen, ser vi at den
beskriver endringene i en annen fil som heter «structs.h». Dette bekrefter
at patch-filen inneholder forskjellene mellom ulike versjoner
av flere filer.

Se før du hopper

Å oppdatere en stor samling med filer kan være litt skremmende, så vi bruker
alternativet «–dry-run» for å sjekke at alt er i orden før vi faktisk
utfører endringene.

Alternativet «–dry-run» instruerer patch til å gjøre alt,
bortsett fra å endre filene. patch utfører alle sine
forhåndskontroller, og rapporterer eventuelle problemer. Ingen filer vil
bli endret.

Hvis ingen problemer rapporteres, kan vi gjenta kommandoen uten
«–dry-run»-alternativet og trygt oppdatere filene våre.

Alternativet «-d» (directory) forteller patch hvilken katalog
den skal jobbe med.

Vi bruker ikke alternativet «-i» (input) for å fortelle patch
hvilken patch-fil som inneholder instruksjonene fra
diff. I stedet omdirigerer vi
patch-filen til patch ved hjelp av <.

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

Av hele katalogen fant diff to filer å oppdatere. Instruksjonene
for endringene i disse to filene er kontrollert av patch, og
ingen problemer er rapportert.

Forhåndskontrollene er OK; vi er klare til å ta av.

Oppdatere en katalog

For å faktisk oppdatere filene, bruker vi den forrige kommandoen uten
alternativet «–dry-run».

patch -ruN -d working < slang.patch

Denne gangen starter hver utdatalinje med «patching», ikke «checking».

Og ingen problemer er rapportert. Vi kan kompilere kildekoden vår, og vi vil være på den nyeste versjonen av programvaren.

Løs dine forskjeller

Dette er den enkleste og tryggeste måten å bruke patch på. Kopier
målfilene dine til en mappe og oppdater den mappen. Kopier filene tilbake når
du er sikker på at oppdateringsprosessen er fullført uten feil.