Sådan anvender du en programrettelse til en fil (og opretter programrettelser) i Linux

Linux- patchkommandoen giver dig mulighed for hurtigt og sikkert at overføre ændringerne fra et sæt filer til et andet sæt filer. Lær hvordan du bruger patchden enkle måde.

Patch og diff kommandoer

Forestil dig, at du har en tekstfil på din computer. Du modtager en ændret version af denne tekstfil fra en anden. Hvordan overfører du hurtigt alle ændringer fra den ændrede fil til din originale fil? Det er her patchog diffkommer i spil. patchog difffindes i Linux og andre Unix-lignende operativsystemer, såsom macOS.

Den diffkommando undersøger to forskellige versioner af en fil og lister forskellene mellem dem. Forskellene kan gemmes i en fil kaldet en patch-fil.

Den  patch kommando kan læse en patch-fil og bruge indholdet som et sæt af instruktioner. Ved at følge disse instruktioner replikeres ændringerne i den ændrede fil i den originale fil.

Forestil dig nu, at processen sker med en hel mappe med tekstfiler. Alt på én gang. Det er kraften i patch.

Nogle gange får du ikke de ændrede filer sendt. Alt hvad du får sendt er patchfilen. Hvorfor sende snesevis af filer rundt, når du kan sende en fil eller sende en fil til nem download?

Hvad laver du med patchfilen for faktisk at patchere dine filer? Bortset fra næsten at være en tunge-twister, er det også et godt spørgsmål. Vi gennemgår det i denne artikel.

Den patchkommando er oftest brugt af folk, der arbejder med software kildekodefiler, men det fungerer lige så godt med et sæt af tekstfiler uanset formål kildekode eller ej.

RELATERET: Sådan sammenlignes to tekstfiler i Linux Terminal

Vores eksempel på scenariet

I dette scenarie er vi i en mappe kaldet arbejde, der indeholder to andre mapper. Den ene kaldes arbejde, og den anden kaldes nyeste . Arbejdsmappen indeholder et sæt kildekodefiler. Den seneste mappe indeholder den nyeste version af disse kildekodefiler, hvoraf nogle er blevet ændret.

For at være sikker er arbejdsmappen en kopi af den aktuelle version af tekstfilerne. Det er ikke den eneste kopi af dem.

Find forskellene mellem to versioner af en fil

Den diffkommando finder forskellene mellem to filer. Dens standardhandling er at liste de ændrede linjer i terminalvinduet.

En fil kaldes slang.c. Vi sammenligner versionen i arbejdsmappen med den i den nyeste mappe.

Indstillingen -u (samlet) fortæller diffogså at liste nogle af de ikke-modificerede tekstlinjer fra før og efter hver af de ændrede sektioner. Disse linjer kaldes kontekstlinjer. De hjælper  patch kommandoen med at lokalisere nøjagtigt, hvor der skal foretages en ændring i den originale fil.

Vi giver navnene på filerne, så det diffved, hvilke filer der skal sammenlignes. Den originale fil vises først, derefter den ændrede fil. Dette er kommandoen, vi udsteder til diff:

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

diffproducerer en outputliste, der viser forskellene mellem filerne. Hvis filerne var identiske, ville der slet ikke være nogen output. At se denne type output fra diffbekræfter, at der er forskelle mellem de to filversioner, og at den originale fil skal patches.

Oprettelse af en patch-fil

Brug følgende kommando for at registrere disse forskelle i en patch-fil. Det er den samme kommando som ovenfor, med output fra diffomdirigeret til en fil kaldet slang.patch.

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

Navnet på patch-filen er vilkårlig. Du kan kalde det hvad du vil. At give det en ".patch" udvidelse er en god idé; Men da det gør det klart, hvilken type fil det er.

patchBrug følgende kommando for at  handle på patch-filen og ændre working / slang.c-filen. Indstillingen -u(samlet) fortæller patch , at programrettelsesfilen indeholder ensartede kontekstlinjer. Med andre ord brugte vi indstillingen -u med diff, så vi bruger -uindstillingen med patch.

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

Hvis alt går godt, er der en enkelt outputlinje, der fortæller dig, at du patchlapper filen.

Sikkerhedskopiering af den originale fil

Vi kan instruere patchat lave en sikkerhedskopi af patchede filer, før de ændres ved hjælp af  -b(backup) -muligheden. Indstillingen -i(input) fortæller patch navnet på den patch-fil, der skal bruges:

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

Filen er patched som før uden nogen synlig forskel i output. Men hvis du kigger ind i arbejdsmappen, vil du se, at filen med navnet slang.c.orig er oprettet. Date- og tidsstemplerne for filerne viser, at slang.c.orig er den originale fil, og slang.c er en ny fil oprettet af patch.

Brug af diff med kataloger

Vi kan bruge difftil at oprette en patch-fil, der indeholder alle forskellene mellem filerne i to mapper. Vi kan derefter bruge den patch-fil til patchat få disse forskelle anvendt på filerne i arbejdsmappen med en enkelt kommando.

De muligheder, vi vil bruge med, differ den -u(samlede kontekst) -mulighed, vi har brugt tidligere, den -r(rekursive) mulighed for at diffse på eventuelle underkataloger og -N(ny fil) -muligheden.

Den -Nindstilling fortæller diff , hvordan man håndterer filer i den nyeste mappe, der ikke er i arbejdsmappen. Det tvinger difftil at lægge instruktioner i patchfilen, så der patch oprettes filer, der er til stede i den nyeste mappe, men som mangler i arbejdsmappen.

Du kan samle indstillingerne sammen, så de bruger en enkelt bindestreg ( -).

Bemærk, at vi kun leverer katalognavne, vi fortæller ikke diffat se på specifikke filer:

diff -ruN arbejder / seneste /> slang.patch

Kigger inde i patchfilen

Lad os se hurtigt på patch-filen. Vi bruger lesstil at se på dets indhold.

Øverst på filen viser forskellene mellem de to versioner af slang.c.

Rulning længere ned gennem patchfilen ser vi, at den derefter beskriver ændringerne i en anden fil kaldet structs.h. Dette bekræfter, at patchfilen bestemt indeholder forskellene mellem forskellige versioner af flere filer.

Se inden du springer

Patching af en stor samling filer kan være lidt nervøs, så vi bruger --dry-run muligheden for at kontrollere, at alt er fint, før vi tager springet og forpligter os til at foretage ændringerne.

Den --dry-runindstilling fortæller patchat gøre alt, bortset fra rent faktisk at ændre filerne. patchudfører alle sine kontroller før flyvningen på filerne, og hvis den støder på problemer, rapporterer den dem. Uanset hvad ændres ingen filer.

Hvis der ikke rapporteres om problemer, kan vi gentage kommandoen uden --dry-runmulighed og selvsikker lappe vores filer.

Indstillingen -d(bibliotek) fortæller, patchhvilken mappe du skal arbejde på.

Bemærk, at vi ikke bruger -i(input) til at fortælle, patchhvilken patch-fil der indeholder instruktionerne fra diff. I stedet omdirigerer vi patch-filen til patchmed <.

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

Ud af hele biblioteket difffandt to filer, der skulle patches. Instruktionerne vedrørende ændringerne for disse to filer er blevet kontrolleret af patch , og der er ikke rapporteret om nogen problemer.

Kontroller før flyvning er OK; vi er klar til start.

Patching en mappe

For virkelig at anvende programrettelserne på filerne bruger vi den forrige kommando uden --dry-runmulighed.

patch -ruN -d arbejder <slang.patch

Denne gang starter hver linje med output ikke med "kontrol", hver linje starter med "patch".

Og der rapporteres ikke om nogen problemer. Vi kan kompilere vores kildekode, og vi er på den nyeste version af softwaren.

Løs dine forskelle

Dette er langt den nemmeste og sikreste måde at bruge patch. Kopier dine målfiler til en mappe, og lapp den mappe. Kopier dem tilbage, når du er glad for, at patches er afsluttet fejlfri.