Het Linux patch
commando kunt u de wijzigingen snel en veilig van de ene set bestanden naar een andere set bestanden overbrengen. Leer hoe te gebruiken patch
op de eenvoudige manier.
De patch- en diff-opdrachten
Stel je voor dat je een tekstbestand op je computer hebt staan. U ontvangt een gewijzigde versie van dat tekstbestand van iemand anders. Hoe zet je snel alle wijzigingen van het gewijzigde bestand over naar je originele bestand? Dat is waar patch
en diff
in het spel komen. patch
en diff
zijn te vinden in Linux en andere Unix-achtige besturingssystemen, zoals macOS.
De diff
commando onderzoekt twee verschillende versies van een bestand en somt de verschillen daartussen op. De verschillen kunnen worden opgeslagen in een bestand dat een patchbestand wordt genoemd.
De patch
commando kan een patchbestand lezen en de inhoud gebruiken als een set instructies. Door deze instructies te volgen, worden de wijzigingen in het gewijzigde bestand gerepliceerd in het originele bestand.
Stel je nu voor dat dat proces plaatsvindt in een hele map met tekstbestanden. Allemaal in één keer. Dat is de kracht van patch
.
Soms krijg je de gewijzigde bestanden niet toegestuurd. Het enige dat u ontvangt, is het patchbestand. Waarom zou u tientallen bestanden rondsturen als u één bestand kunt verzenden of één bestand kunt posten om het gemakkelijk te downloaden?
Wat doe je met het patchbestand om je bestanden daadwerkelijk te patchen? Behalve dat het bijna een tongbreker is, is dat ook een goede vraag. We zullen je er in dit artikel doorheen leiden.
De patch
commando wordt meestal gebruikt door mensen die met softwarebroncodebestanden werken, maar het werkt even goed met elke set tekstbestanden, ongeacht hun doel, broncode of niet.
VERWANT: Hoe twee tekstbestanden in de Linux-terminal te vergelijken
Ons voorbeeldscenario
In dit scenario bevinden we ons in een map met de naam werk die twee andere mappen bevat. De ene heet werken, en de andere heet laatste. De werkmap bevat een set broncodebestanden. De laatste map bevat de meest recente versie van die broncodebestanden, waarvan sommige zijn gewijzigd.
Voor de zekerheid is de werkmap een kopie van de huidige versie van de tekstbestanden. Het is niet de enige kopie ervan.
De verschillen tussen twee versies van een bestand zoeken
De diff
commando zoekt de verschillen tussen twee bestanden. De standaardactie is om de gewijzigde regels in het terminalvenster weer te geven.
Een bestand heet slang.c
. We vergelijken de versie in de werkdirectory met die in de laatste directory.
De -u
(verenigde) optie vertelt diff
om ook enkele niet-gewijzigde tekstregels van voor en na elk van de gewijzigde secties te vermelden. Deze regels worden contextregels genoemd. Ze helpen de patch
commando lokaliseer precies waar een wijziging in het originele bestand moet worden aangebracht.
We bieden de namen van de bestanden zodat diff
weet welke bestanden moeten worden vergeleken. Het originele bestand wordt eerst vermeld, daarna het gewijzigde bestand. Dit is de opdracht die we geven diff
:
diff -u working/slang.c latest/slang.c
diff
produceert een uitvoerlijst met de verschillen tussen de bestanden. Als de bestanden identiek waren, zou er helemaal geen uitvoer in de lijst staan. Dit type uitvoer zien van diff
bevestigt dat er verschillen zijn tussen de twee bestandsversies en dat het originele bestand moet worden gepatcht.
Een patchbestand maken
Gebruik de volgende opdracht om die verschillen in een patchbestand vast te leggen. Het is hetzelfde commando als hierboven, met de uitvoer van diff
omgeleid naar een bestand met de naam slang.patch.
diff -u working/slang.c latest/slang.c > slang.patch
patch -u working.slang.c -i slang.patch
Als alles goed gaat, is er een enkele regel met uitvoer die u vertelt patch
patcht het bestand.
Een back-up maken van het originele bestand
We kunnen instrueren patch
om een reservekopie te maken van gepatchte bestanden voordat ze worden gewijzigd door de -b
(backup) optie. De -i
(input) optie vertelt patch de naam van het patchbestand dat moet worden gebruikt:
patch -u -b working.slang.c -i slang.patch
Het bestand is gepatcht zoals eerder, zonder zichtbaar verschil in de uitvoer. Als u echter in de werkmap kijkt, ziet u dat het bestand slang.c.orig is gemaakt. De datum- en tijdstempels van de bestanden laten zien dat slang.c.orig het originele bestand is en slang.c een nieuw bestand is gemaakt door patch
.
Diff gebruiken met Directories
We kunnen gebruiken diff
om een patchbestand te maken dat alle verschillen tussen de bestanden in twee mappen bevat. We kunnen dat patchbestand dan gebruiken met patch
om die verschillen met een enkele opdracht toe te passen op de bestanden in de werkmap.
De opties waarmee we gaan gebruiken diff
zijn de -u
(verenigde context) optie die we eerder hebben gebruikt, de -r
(recursieve) optie om diff
kijk in eventuele submappen en het -N
(nieuw bestand) optie.
De -N
optie vertelt diff
hoe om te gaan met bestanden in de laatste directory die niet in de werkdirectory staan. Het dwingt diff
om instructies in het patchbestand te plaatsen zodatpatch
maakt bestanden aan die aanwezig zijn in de laatste map maar ontbreken in de werkmap.
U kunt de opties bundelen zodat ze een enkel koppelteken gebruiken (-
).
Merk op dat we alleen de directorynamen verstrekken, we vertellen het niet diff
om naar specifieke bestanden te kijken:
diff -ruN working/ latest/ > slang.patch
In het patchbestand gluren
Laten we het patchbestand snel bekijken. We zullen gebruiken less
om naar de inhoud te kijken.
De bovenkant van het bestand toont de verschillen tussen de twee versies van slang. C.
Als we verder naar beneden scrollen door het patchbestand, zien we dat het dan de wijzigingen beschrijft in een ander bestand met de naam structs.h. Dit bevestigt dat het patchbestand zeker de verschillen bevat tussen verschillende versies van meerdere bestanden.
Kijk voordat je springt
Het patchen van een grote verzameling bestanden kan een beetje zenuwslopend zijn, dus gaan we de --dry-run
optie om alles te controleren is in orde voordat we de sprong wagen en ons ertoe verbinden de wijzigingen aan te brengen.
De --dry-run
optie vertelt patch
om alles te doen behalve het daadwerkelijk wijzigen van de bestanden. patch
voert al zijn pre-flight checks uit op de bestanden en als hij problemen ondervindt, rapporteert hij deze. Hoe dan ook, er worden geen bestanden gewijzigd.
Als er geen problemen worden gerapporteerd, kunnen we de opdracht herhalen zonder de --dry-run
optie en vol vertrouwen onze bestanden patchen.
De -d
(directory) optie tell patch
aan welke directory moet worden gewerkt.
Merk op dat we niet de … gebruiken -i
(input) optie om te vertellen patch
welk patchbestand de instructies bevat van diff
. In plaats daarvan leiden we het patchbestand om naar patch
met <
.
patch --dry-run -ruN -d working < slang.patch
Uit de hele directory, diff
vond twee bestanden om te patchen. De instructies met betrekking tot de aanpassingen voor die twee bestanden zijn gecontroleerd door patch
, en er zijn geen problemen gemeld.
Controles vóór de vlucht zijn OK; we zijn klaar om op te stijgen.
Een directory patchen
Om de patches echt op de bestanden toe te passen, gebruiken we het vorige commando zonder de --dry-run
optie.
patch -ruN -d working < slang.patch
Deze keer begint niet elke regel uitvoer met ‘controleren’, maar begint elke regel met ‘patchen’.
En er worden geen problemen gemeld. We kunnen onze broncode compileren en we gebruiken de nieuwste versie van de software.
Los uw verschillen op
Dit is verreweg de gemakkelijkste en veiligste manier om te gebruiken patch
. Kopieer uw doelbestanden naar een map en patch die map. Kopieer ze terug als u tevreden bent dat het patchproces foutloos is voltooid.