Hoe u een patch op een bestand kunt toepassen (en patches kunt maken) in Linux

Pc met een shell-prompt op een Linux-desktop
Fatmawati Achmad Zaenuri / Shutterstock.com

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 -u working / slang.s latest / slang.c in een terminalvenster

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.

uitvoer van diff in een terminalvenster

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

diff -u working / slang.c latest / slang.c> slang.patch in een terminalvenster” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>De naam van het patchbestand is willekeurig.  U kunt het alles noemen wat u maar wilt.  Het is een goed idee om het een “.patch” -extensie te geven;  het maakt echter wel duidelijk welk type bestand het is.</p>
<p>Maken <code>patch</code> gebruik het patchbestand en wijzig het werkende / slang.c-bestand, gebruik het volgende commando.  De <code>-u</code> (verenigde) optie verhuurt <code>patch</code> weet dat het patch-bestand verenigde contextregels bevat.  Met andere woorden, we gebruikten de optie -u met diff, dus we gebruiken de <code>-u</code> optie met <code>patch</code>.</p>
<p><span style=patch -u working.slang.c -i slang.patch

patch -u working.slang.c -i slang.patch in een terminalvenster

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

patch -u working.slang.c -i slang.patch in een terminalvenster

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.

uitvoer van ls in een terminalvenster

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

diff -ruN working / latest /> slang.patch” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<h2 role=In het patchbestand gluren

Laten we het patchbestand snel bekijken. We zullen gebruiken less om naar de inhoud te kijken.

minder jargon.patch in een terminalvenster

De bovenkant van het bestand toont de verschillen tussen de twee versies van slang. C.

less slang.patch met de bovenkant van ile in een terminalvenster

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.

less slang.patch met het midden van het bestand in een terminalvenster

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

patch --dry-run -ruN -d werkt <slang.patch in een terminalvenster

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

patch -ruN -d werkt <slang.patch in een terminalvenster

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.

Nieuwste artikelen

spot_img

Related Stories

Leave A Reply

Vul alstublieft uw commentaar in!
Vul hier uw naam in