Πώς να εφαρμόσετε μια ενημέρωση κώδικα σε ένα αρχείο (και να δημιουργήσετε ενημερώσεις κώδικα) στο Linux

Η εντολή ενημέρωσης κώδικα Linux σάς επιτρέπει να μεταφέρετε τις αλλαγές από ένα σύνολο αρχείων σε ένα άλλο σύνολο αρχείων γρήγορα και με ασφάλεια. Μάθετε πώς να χρησιμοποιείτε το patch με τον απλό τρόπο.

Οι εντολές patch και diff

Φανταστείτε ότι έχετε ένα αρχείο κειμένου στον υπολογιστή σας. Λαμβάνετε μια τροποποιημένη έκδοση αυτού του αρχείου κειμένου από κάποιον άλλο. Πώς μεταφέρετε γρήγορα όλες τις αλλαγές από το τροποποιημένο αρχείο στο αρχικό σας αρχείο; Εκεί μπαίνουν στο παιχνίδι το patch και το diff. Η ενημέρωση κώδικα και η διαφορά βρίσκονται στο Linux και σε άλλα λειτουργικά συστήματα τύπου Unix, όπως το macOS.

Η εντολή diff εξετάζει δύο διαφορετικές εκδόσεις ενός αρχείου και απαριθμεί τις διαφορές μεταξύ τους. Οι διαφορές μπορούν να αποθηκευτούν σε ένα αρχείο που ονομάζεται αρχείο ενημέρωσης κώδικα.

Η εντολή patch μπορεί να διαβάσει ένα αρχείο ενημέρωσης κώδικα και να χρησιμοποιήσει τα περιεχόμενα ως ένα σύνολο οδηγιών. Ακολουθώντας αυτές τις οδηγίες, οι αλλαγές στο τροποποιημένο αρχείο είναι αντιγράφεται στο πρωτότυπο αρχείο.

Τώρα φανταστείτε ότι αυτή η διαδικασία συμβαίνει σε έναν ολόκληρο κατάλογο αρχείων κειμένου. Όλα με μια κίνηση. Αυτή είναι η δύναμη του μπαλώματος.

Μερικές φορές δεν σας αποστέλλονται τα τροποποιημένα αρχεία. Το μόνο που λαμβάνετε είναι το αρχείο ενημέρωσης κώδικα. Γιατί να στείλετε δεκάδες αρχεία όταν μπορείτε να στείλετε ένα αρχείο ή να δημοσιεύσετε ένα αρχείο για εύκολη λήψη;

Τι κάνετε με το αρχείο ενημέρωσης κώδικα για να επιδιορθώσετε πραγματικά τα αρχεία σας; Εκτός από σχεδόν γλωσσολαλιά, είναι και μια καλή ερώτηση. Θα σας καθοδηγήσουμε σε αυτό το άρθρο.

Η εντολή patch χρησιμοποιείται συχνότερα από άτομα που εργάζονται με αρχεία πηγαίου κώδικα λογισμικού, αλλά λειτουργεί εξίσου καλά με οποιοδήποτε σύνολο αρχείων κειμένου ανεξάρτητα από τον σκοπό τους, τον πηγαίο κώδικα ή όχι.

Το παράδειγμά μας σενάριο

Σε αυτό το σενάριο, βρισκόμαστε σε έναν κατάλογο που ονομάζεται work και περιέχει δύο άλλους καταλόγους. Το ένα λέγεται δουλεύοντας και το άλλο λέγεται πιο πρόσφατο. Ο κατάλογος εργασίας περιέχει ένα σύνολο αρχείων πηγαίου κώδικα. Ο πιο πρόσφατος κατάλογος περιέχει την πιο πρόσφατη έκδοση αυτών των αρχείων πηγαίου κώδικα, μερικά από τα οποία έχουν τροποποιηθεί.

  Πώς να παίξετε το Overlord στο Linux

Για να είμαστε ασφαλείς, ο κατάλογος εργασίας είναι ένα αντίγραφο της τρέχουσας έκδοσης των αρχείων κειμένου. Δεν είναι το μόνο αντίγραφό τους.

Εύρεση των διαφορών μεταξύ δύο εκδόσεων ενός αρχείου

Η εντολή diff βρίσκει τις διαφορές μεταξύ δύο αρχείων. Η προεπιλεγμένη του δράση είναι να παραθέτει τις τροποποιημένες γραμμές στο παράθυρο του τερματικού.

Ένα αρχείο ονομάζεται slang.c. Θα συγκρίνουμε την έκδοση στον κατάλογο εργασίας με αυτή στον πιο πρόσφατο κατάλογο.

Η επιλογή -u (ενοποιημένη) λέει στο diff να παραθέτει επίσης μερικές από τις μη τροποποιημένες γραμμές κειμένου από πριν και μετά από κάθε μια από τις ενότητες που έχουν αλλάξει. Αυτές οι γραμμές ονομάζονται γραμμές περιβάλλοντος. Βοηθούν την εντολή patch να εντοπίσει ακριβώς πού πρέπει να γίνει μια αλλαγή στο αρχικό αρχείο.

Παρέχουμε τα ονόματα των αρχείων έτσι ώστε η διαφορά να γνωρίζει ποια αρχεία να συγκρίνει. Το αρχικό αρχείο παρατίθεται πρώτα και μετά το τροποποιημένο αρχείο. Αυτή είναι η εντολή που δίνουμε για να διαφοροποιήσουμε:

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

Το diff παράγει μια λίστα εξόδου που δείχνει τις διαφορές μεταξύ των αρχείων. Εάν τα αρχεία ήταν πανομοιότυπα, δεν θα υπήρχε καμία έξοδος στη λίστα. Η εμφάνιση αυτού του τύπου εξόδου από το diff επιβεβαιώνει ότι υπάρχουν διαφορές μεταξύ των δύο εκδόσεων αρχείων και ότι το αρχικό αρχείο χρειάζεται επιδιόρθωση.

Δημιουργία αρχείου ενημέρωσης κώδικα

Για να καταγράψετε αυτές τις διαφορές σε ένα αρχείο ενημέρωσης κώδικα, χρησιμοποιήστε την ακόλουθη εντολή. Είναι η ίδια εντολή με την παραπάνω, με την έξοδο από το diff να ανακατευθύνεται σε ένα αρχείο που ονομάζεται slang.patch.

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

diff -u working/slang.c latest/slang.c > slang.patch σε παράθυρο τερματικού” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Το όνομα του αρχείου ενημέρωσης κώδικα είναι αυθαίρετο.  Μπορείτε να το ονομάσετε όπως θέλετε.  Το να του δώσετε μια επέκταση “.patch” είναι καλή ιδέα.  Ωστόσο, καθώς καθιστά σαφές τι τύπο αρχείου είναι.</p>
<p>Για να κάνετε την ενημερωμένη έκδοση κώδικα να ενεργεί στο αρχείο ενημέρωσης κώδικα και να τροποποιήσετε το αρχείο work/slang.c, χρησιμοποιήστε την ακόλουθη εντολή.  Η επιλογή -u (ενοποιημένη) ενημερώνει την ενημέρωση κώδικα ότι το αρχείο ενημέρωσης κώδικα περιέχει ενοποιημένες γραμμές περιβάλλοντος.  Με άλλα λόγια, χρησιμοποιήσαμε την επιλογή -u με diff, επομένως χρησιμοποιούμε την επιλογή -u με patch.</p>
<div style=

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

Εάν όλα πάνε καλά, υπάρχει μια μόνο γραμμή εξόδου που σας λέει ότι η ενημερωμένη έκδοση κώδικα διορθώνει το αρχείο.

Δημιουργία αντιγράφου ασφαλείας του αρχικού αρχείου

Μπορούμε να δώσουμε εντολή στην ενημερωμένη έκδοση κώδικα να δημιουργήσει ένα αντίγραφο ασφαλείας των διορθωμένων αρχείων προτού αλλάξουν χρησιμοποιώντας την επιλογή -b (αντίγραφο ασφαλείας). Η επιλογή -i (εισαγωγή) λέει στην ενημέρωση κώδικα το όνομα του αρχείου ενημέρωσης κώδικα που θα χρησιμοποιηθεί:

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

Το αρχείο έχει επιδιορθωθεί όπως πριν, χωρίς ορατή διαφορά στην έξοδο. Ωστόσο, εάν κοιτάξετε στον φάκελο εργασίας, θα δείτε ότι το αρχείο που ονομάζεται slang.c.orig έχει δημιουργηθεί. Οι σφραγίδες ημερομηνίας και ώρας των αρχείων δείχνουν ότι το slang.c.orig είναι το αρχικό αρχείο και το slang.c είναι ένα νέο αρχείο που δημιουργήθηκε από ενημέρωση κώδικα.

Χρήση του diff With Directories

Μπορούμε να χρησιμοποιήσουμε το diff για να δημιουργήσουμε ένα αρχείο ενημέρωσης κώδικα που περιέχει όλες τις διαφορές μεταξύ των αρχείων σε δύο καταλόγους. Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε αυτό το αρχείο ενημέρωσης κώδικα με ενημερωμένη έκδοση κώδικα για να εφαρμόσουμε αυτές τις διαφορές στα αρχεία του φακέλου εργασίας με μία μόνο εντολή.

Οι επιλογές που πρόκειται να χρησιμοποιήσουμε με το diff είναι η επιλογή -u (ενοποιημένο πλαίσιο) που χρησιμοποιήσαμε νωρίτερα, η επιλογή -r (αναδρομική) για να δούμε τη διαφορά σε οποιουσδήποτε υποκαταλόγους και η επιλογή -N (νέο αρχείο).

Η επιλογή -N λέει διαφορετικά πώς να χειρίζεστε αρχεία στον πιο πρόσφατο κατάλογο που δεν βρίσκονται στον κατάλογο εργασίας. Αναγκάζει το diff να τοποθετήσει οδηγίες στο αρχείο ενημέρωσης κώδικα, έτσι ώστε η ενημερωμένη έκδοση κώδικα να δημιουργεί αρχεία που υπάρχουν στον πιο πρόσφατο κατάλογο αλλά λείπουν από τον κατάλογο εργασίας.

Μπορείτε να ομαδοποιήσετε τις επιλογές μεταξύ τους, ώστε να χρησιμοποιούν μία μόνο παύλα (-).

Λάβετε υπόψη ότι παρέχουμε μόνο τα ονόματα των καταλόγων, δεν λέμε διαφορετικά για να δούμε συγκεκριμένα αρχεία:

diff -ruN working/ latest/ > slang.patch

diff -ruN working/ last/ > slang.patch” width=”646″ height=”77″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<div style=

Κοιτάζοντας μέσα στο αρχείο ενημέρωσης κώδικα

Ας ρίξουμε μια γρήγορη ματιά στο αρχείο ενημέρωσης κώδικα. Θα χρησιμοποιήσουμε λιγότερα για να δούμε το περιεχόμενό του.

Το επάνω μέρος του αρχείου δείχνει τις διαφορές μεταξύ των δύο εκδόσεων του slang.c.

Κάνοντας κύλιση προς τα κάτω μέσα στο αρχείο ενημέρωσης κώδικα, βλέπουμε ότι στη συνέχεια περιγράφει τις αλλαγές σε ένα άλλο αρχείο που ονομάζεται structs.h. Αυτό επαληθεύει ότι το αρχείο ενημέρωσης κώδικα περιέχει οπωσδήποτε τις διαφορές μεταξύ διαφορετικών εκδόσεων πολλών αρχείων.

Κοίτα πριν πηδήξεις

Η επιδιόρθωση μιας μεγάλης συλλογής αρχείων μπορεί να είναι λίγο ενοχλητική, επομένως θα χρησιμοποιήσουμε την επιλογή –dry-run για να ελέγξουμε ότι όλα είναι εντάξει προτού κάνουμε το βήμα και δεσμευτούμε να κάνουμε τις αλλαγές.

Η επιλογή –dry-run λέει στην ενημέρωση κώδικα να κάνει τα πάντα εκτός από την πραγματική τροποποίηση των αρχείων. Το patch θα εκτελέσει όλους τους ελέγχους πριν από την πτήση στα αρχεία και αν αντιμετωπίσει προβλήματα, θα τα αναφέρει. Σε κάθε περίπτωση, κανένα αρχείο δεν τροποποιείται.

Εάν δεν αναφερθούν προβλήματα, μπορούμε να επαναλάβουμε την εντολή χωρίς την επιλογή –dry-run και να επιδιορθώσουμε με σιγουριά τα αρχεία μας.

Η επιλογή -d (κατάλογος) λέει στην ενημέρωση κώδικα σε ποιον κατάλογο να εργαστεί.

Σημειώστε ότι δεν χρησιμοποιούμε την επιλογή -i (εισαγωγή) για να πούμε στην ενημερωμένη έκδοση κώδικα ποιο αρχείο ενημερωμένης έκδοσης κώδικα περιέχει τις οδηγίες από το diff. Αντίθετα, ανακατευθύνουμε το αρχείο ενημέρωσης κώδικα σε ενημερωμένη έκδοση κώδικα με <. wp_automatic_readability="17.5">

patch --dry-run -ruN -d working 

Out 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 working 

This 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.