Kommandot Linux patch låter dig överföra ändringarna från en uppsättning filer till en annan uppsättning filer snabbt och säkert. Lär dig hur du använder patch på det enkla sättet.
Innehållsförteckning
Kommandona patch och diff
Föreställ dig att du har en textfil på din dator. Du får en modifierad version av den textfilen från någon annan. Hur överför du snabbt alla ändringar från den ändrade filen till din ursprungliga fil? Det är där patch och diff spelar in. patch och diff finns i Linux och andra Unix-liknande operativsystem, som macOS.
Kommandot diff undersöker två olika versioner av en fil och listar skillnaderna mellan dem. Skillnaderna kan lagras i en fil som kallas en patch-fil.
Kommandot patch kan läsa en patchfil och använda innehållet som en uppsättning instruktioner. Genom att följa dessa instruktioner är ändringarna i den ändrade filen replikeras i originalet fil.
Föreställ dig nu att processen händer med en hel katalog med textfiler. Allt i ett svep. Det är kraften i patch.
Ibland får du inte de ändrade filerna skickade. Allt du får skickat är patchfilen. Varför skicka dussintals filer runt när du kan skicka en fil, eller lägga upp en fil för enkel nedladdning?
Vad gör du med patchfilen för att faktiskt patcha dina filer? Förutom att nästan vara en tungvridare är det också en bra fråga. Vi går igenom det i den här artikeln.
Kommandot patch används oftast av personer som arbetar med källkodsfiler för programvara, men det fungerar lika bra med vilken uppsättning textfiler som helst, oavsett syfte, källkod eller inte.
Vårt exempelscenario
I det här scenariot befinner vi oss i en katalog som heter work som innehåller två andra kataloger. Den ena heter att arbeta och den andra heter senaste. Arbetskatalogen innehåller en uppsättning källkodsfiler. Den senaste katalogen innehåller den senaste versionen av dessa källkodsfiler, av vilka några har modifierats.
För säkerhets skull är arbetskatalogen en kopia av den aktuella versionen av textfilerna. Det är inte den enda kopian av dem.
Hitta skillnaderna mellan två versioner av en fil
Kommandot diff hittar skillnaderna mellan två filer. Dess standardåtgärd är att lista de modifierade raderna i terminalfönstret.
En fil heter slang.c. Vi kommer att jämföra versionen i arbetskatalogen med den i den senaste katalogen.
Alternativet -u (unified) säger åt diff att även lista några av de omodifierade textraderna från före och efter var och en av de ändrade avsnitten. Dessa linjer kallas kontextlinjer. De hjälper patch-kommandot att hitta exakt var en ändring måste göras i originalfilen.
Vi tillhandahåller namnen på filerna så att diff vet vilka filer som ska jämföras. Den ursprungliga filen listas först, sedan den ändrade filen. Detta är kommandot vi utfärdar för att diff:
diff -u working/slang.c latest/slang.c
diff producerar en utdatalista som visar skillnaderna mellan filerna. Om filerna var identiska skulle det inte finnas någon utdata alls. Att se den här typen av utdata från diff bekräftar att det finns skillnader mellan de två filversionerna och att originalfilen behöver korrigeras.
Skapa en patchfil
För att fånga dessa skillnader i en patchfil, använd följande kommando. Det är samma kommando som ovan, med utdata från diff omdirigerad till en fil som heter slang.patch.
diff -u working/slang.c latest/slang.c > slang.patch
Om allt går bra, finns det en enda rad med utdata som talar om för dig att patch patchar filen.
Göra en säkerhetskopia av originalfilen
Vi kan instruera patch att göra en säkerhetskopia av korrigerade filer innan de ändras genom att använda alternativet -b (säkerhetskopiering). Alternativet -i (ingång) talar om för patch namnet på patchfilen som ska användas:
patch -u -b working.slang.c -i slang.patch
Filen korrigeras som tidigare, utan någon synlig skillnad i utdata. Men om du tittar in i arbetsmappen ser du att filen slang.c.orig har skapats. Filernas datum- och tidsstämplar visar att slang.c.orig är originalfilen och slang.c är en ny fil skapad av patch.
Använda diff med kataloger
Vi kan använda diff för att skapa en patchfil som innehåller alla skillnader mellan filerna i två kataloger. Vi kan sedan använda den patchfilen med patch för att få dessa skillnader att tillämpas på filerna i arbetsmappen med ett enda kommando.
Alternativen vi kommer att använda med diff är alternativet -u (unified context) som vi har använt tidigare, alternativet -r (rekursivt) för att få diff att titta in i alla underkataloger och alternativet -N (ny fil).
Alternativet -N berättar för diff hur man hanterar filer i den senaste katalogen som inte finns i arbetskatalogen. Det tvingar diff att lägga instruktioner i patchfilen så att patch skapar filer som finns i den senaste katalogen men som saknas i arbetskatalogen.
Du kan sätta ihop alternativen så att de använder ett enda bindestreck (-).
Observera att vi bara tillhandahåller katalognamnen, vi säger inte åt diff att titta på specifika filer:
diff -ruN working/ latest/ > slang.patch
Kikar in i patchfilen
Låt oss ta en snabb titt i patchfilen. Vi kommer att använda mindre för att titta på innehållet.
Den övre delen av filen visar skillnaderna mellan de två versionerna av slang.c.
Scrollar vi längre ner genom patchfilen ser vi att den sedan beskriver ändringarna i en annan fil som heter structs.h. Detta verifierar att patchfilen definitivt innehåller skillnaderna mellan olika versioner av flera filer.
Titta innan du hoppar
Att patcha en stor samling filer kan vara lite irriterande, så vi kommer att använda alternativet –dry-run för att kontrollera att allt är bra innan vi tar steget och förbinder oss att göra ändringarna.
Alternativet –dry-run säger åt patch att göra allt förutom att faktiskt modifiera filerna. patch kommer att utföra alla sina kontroller före flygningen av filerna och om den stöter på några problem rapporterar den dem. Hur som helst, inga filer ändras.
Om inga problem rapporteras kan vi upprepa kommandot utan alternativet –dry-run och med förtroende korrigera våra filer.
Alternativet -d (katalog) talar om för patch vilken katalog som ska arbeta på.
Observera att vi inte använder alternativet -i (ingång) för att tala om för patch vilken patchfil som innehåller instruktionerna från diff. Istället omdirigerar vi patchfilen till patch med <. wp_automatic_readability="17.5">
patch --dry-run -ruN -d workingOut 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 workingThis time each line of output doesn’t start with “checking,” each line starts with “patching.”
And no problems are reported. We can compile our source code, and we’ll be on the latest version of the software.
Settle Your Differences
This is by far the easiest and safest way to use patch. Copy your target files to a folder and patch that folder. Copy them back when you’re happy that the patching process completed error free.