Javítás alkalmazása fájlra (és javítások létrehozása) Linux alatt

A Linux patchparanccsal gyorsan és biztonságosan átviheti az egyik fájlkészletből a másikba a változásokat. Megtanulják, hogyan kell használni patchaz egyszerű módszert.

A javítás és a diff parancsok

Képzelje el, hogy van egy szöveges fájl a számítógépén. A szöveges fájl módosított verzióját valaki mástól kapja meg. Hogyan helyezheti át gyorsan az összes módosítást a módosított fájlból az eredeti fájlba? Ott patchés diffjöjjön a játék. patchés diffmegtalálhatók a Linux-ban és más Unix-szerű operációs rendszerekben, például a macOS-ban.

A diffparancs megvizsgálja a fájl két különböző változatát, és felsorolja a közöttük lévő különbségeket. A különbségek a patch fájl nevű fájlban tárolhatók.

patch parancs elolvashatja a patch fájlt, és a tartalmat utasításkészletként használhatja. Ezeknek az utasításoknak a betartásával a módosított fájlban végrehajtott módosítások megismétlődnek az eredeti fájlban.

Most képzelje el, hogy a folyamat a szöveges fájlok teljes könyvtárával történik. Minden egy mozdulattal. Ez a hatalma patch.

Néha nem kapják meg a módosított fájlokat. Csak a patch fájlt kapja. Miért kellene több tucat fájlt elküldeni, ha egy fájlt küldhet el, vagy egy fájlt feladhat az egyszerű letöltéshez?

Mit csinál a javítófájllal, hogy valóban javítsa a fájlokat? Eltekintve attól, hogy szinte nyelvcsavaró, ez is jó kérdés. Ebben a cikkben áttekintjük.

A patchparancsot leggyakrabban a szoftver forráskódfájljaival dolgozók használják, de ugyanolyan jól működik bármilyen szövegfájlkészlettel, függetlenül azok céljától, forráskódjától vagy sem.

KAPCSOLÓDÓ: Hogyan lehet összehasonlítani két szövegfájlt a Linux terminálon

Példapéldánk

Ebben a forgatókönyvben egy work nevű könyvtárban vagyunk, amely két másik könyvtárat tartalmaz. Az egyiket munkának, a másikat legújabbnak hívják . A munkakönyvtár egy sor forráskódfájlt tartalmaz. A legújabb könyvtár tartalmazza azoknak a forráskódfájloknak a legújabb verzióját, amelyek közül néhányat módosítottak.

A biztonság érdekében a munkakönyvtár a szöveges fájlok aktuális változatának másolata. Nem ez az egyetlen példányuk.

A fájl két verziója közötti különbségek keresése

A diffparancs megtalálja a különbségeket két fájl között. Alapértelmezett művelete a módosított sorok felsorolása a terminál ablakában.

Az egyik fájl neve slang.c. Összehasonlítjuk a munkakönyvtárban található verziót a legújabb könyvtárban található verzióval.

Az -u (egységes) opció azt mondja, diffhogy fel kell sorolni néhány módosítatlan szövegsort a módosított szakaszok elõtt és után. Ezeket a vonalakat nevezzük kontextusvonalaknak. Segítenek a  patch parancsnak pontosan megtalálni, hogy hol kell változtatni az eredeti fájlban.

Megadjuk a fájlok nevét, hogy difftudják, mely fájlokat kell összehasonlítani. Először az eredeti fájl, majd a módosított fájl szerepel. Ezt a parancsot adjuk ki diff:

diff -u dolgozó / szleng.c legújabb / szleng.c

diffkimeneti listát készít, amely bemutatja a fájlok közötti különbségeket. Ha a fájlok azonosak lennének, akkor egyáltalán nem lenne kimenet. Az ilyen típusú kimenet látása diffmegerősíti, hogy vannak különbségek a két fájlverzió között, és hogy az eredeti fájlt javításra van szükség.

Patch FIle készítése

Ha ezeket a különbségeket javítófájlba szeretné rögzíteni, használja a következő parancsot. Ez ugyanaz a parancs, mint fent, a kimenetet diffátirányították a slang.patch nevű fájlba.

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

A patch fájl neve tetszőleges. Nevezheted bárminek, amit szeretsz. Jó ötlet a „.patch” kiterjesztés megadása; azonban mivel világossá teszi, hogy milyen típusú fájlról van szó.

patchjavítófájl kezeléséhez és a working / slang.c fájl módosításához használja a következő parancsot. Az -u(egységes) opcióval tudatja patch , hogy a javítófájl egységes kontextussorokat tartalmaz. Más szóval, azt az -u opció diff, így használjuk a -ubeállítást patch.

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

Ha minden jól megy, egyetlen kimeneti sor mondja ki, hogy patchjavítja a fájlt.

Biztonsági másolat készítése az eredeti FIle-ről

A (mentés) opcióval utasíthatjuk patch, hogy készítsen biztonsági másolatot a javított fájlokról, mielőtt azok megváltoznának  -b. Az -i(input) opció megmondja a javításnak a használni kívánt patch fájl nevét:

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

A fájl javítása a korábbiakhoz hasonló, a kimeneten nincs látható különbség. Ha azonban belenéz a munkamappába, akkor látni fogja, hogy a slang.c.orig nevű fájl létrejött. A fájlok dátum- és időbélyegzői azt mutatják, hogy a slang.c.orig az eredeti fájl, a slang.c pedig egy új fájl, amelyet a patch.

A diff használata a Könyvtárakkal

Használhatunk diffolyan patch fájlt létrehozni, amely tartalmazza a fájlok közötti különbségeket két könyvtárban. Ezután használhatjuk azt a javítófájlt azzal patch, hogy ezeket a különbségeket egyetlen paranccsal alkalmazzuk a munkamappa fájljaira.

A lehetőségek fogunk használni diffa -u(egységes keretek között) lehetőség már korábban használt, a -r(rekurzív) lehetőséget, hogy diffbetekintést bármely alkönyvtárakat és az -N(új fájl) opciót.

Az -Nopció megmondja, diff hogyan kell kezelni azokat a fájlokat a legújabb könyvtárban, amelyek nincsenek a munkakönyvtárban. Arra kényszeríti diffaz utasításokat a javítófájlba, hogy patch olyan fájlokat hozzon létre, amelyek a legújabb könyvtárban találhatók, de hiányoznak a munkakönyvtárból.

Összekapcsolhatja az opciókat, hogy azok egyetlen kötőjelet ( -) használhassanak.

Ne feledje, hogy csak a könyvtárneveket adjuk meg, és nem azt mondjuk, diffhogy nézzen meg konkrét fájlokat:

diff -ruN working / latest /> slang.patch

Bepillantás a javítófájl belsejébe

Vizsgáljuk meg gyorsan a patch fájlt. Meg fogjuk lessnézni annak tartalmát.

A fájl tetején láthatóak a különbségek a szleng.c két verziója között.

Tovább lapozva a patch fájlban, azt látjuk, hogy ez leírja a változásokat egy másik fájlban, az struct.h néven. Ez ellenőrzi, hogy a patch fájl feltétlenül tartalmazza-e a különbségeket a több fájl különböző verziói között.

Gondold át

A nagy fájlgyűjtemény javítása kissé idegesítő lehet, ezért élni fogunk azzal a --dry-run lehetőséggel, hogy minden rendben legyen, mielőtt belevágunk és elkötelezzük magunkat a változtatások mellett.

Az --dry-runopció szerint patcha fájlok tényleges módosításától eltekintve mindent meg kell tenni. patchrepülés előtti összes ellenőrzését elvégzi a fájlokon, és ha bármilyen problémába ütközik, jelentést tesz róluk. Akárhogy is, egyetlen fájl sem módosul.

Ha nem jelentenek problémát, akkor megismételhetjük a parancsot az --dry-runopció nélkül, és magabiztosan javíthatjuk a fájljainkat.

A -d(könyvtár) opció megmondja, hogy patchmelyik könyvtáron dolgozzon.

Ne feledje, hogy nem az -i(input) opcióval mondjuk meg, hogy patchmelyik patch fájl tartalmazza az utasításokat diff. Ehelyett átirányítjuk a patch fájlt patcha <.

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

A teljes könyvtárból diffkét, javítandó fájlt talált. A két fájl módosításával kapcsolatos utasításokat ellenőrizte patch , és nem jelentettek problémákat.

A repülés előtti ellenőrzések rendben vannak; készen állunk a felszállásra.

Könyvtár javítása

A patchek valódi alkalmazásához a fájlokra az előző parancsot használjuk az --dry-runopció nélkül .

patch -ruN -d működő <szleng.patch

Ezúttal a kimenet minden sora nem „ellenőrzéssel” kezdődik, minden sor „javítással” kezdődik.

És nem jelentettek problémákat. Összeállíthatjuk a forráskódunkat, és a szoftver legújabb verzióját használjuk.

Rendezze a különbségeket

Ez messze a legegyszerűbb és legbiztonságosabb használat patch. Másolja a célfájlokat egy mappába, és javítsa ki azt a mappát. Másolja vissza őket, ha örül annak, hogy a javítási folyamat hibamentesen befejeződött.