Einführung Mit diff und patch - Linux Academy Blog
Dieses Tutorial setzt voraus, einige grundlegenden Linux und Kommandozeilen-Kenntnisse, wie Verzeichnisse zu ändern, das Kopieren von Dateien und Bearbeiten von Textdateien.
1C1
< These are a few words.
Kein Newline am Ende der Datei
-
> Diese sind immer noch nur ein paar Worte.
Kein Newline am Ende der Datei
Das "<” means that patch should remove the characters after this sign, and the “>“Bedeutet, dass die Zeichen nach diesem Zeichen hinzugefügt werden sollen. Wenn der Inhalt ersetzt (ein „c“ zwischen den Zeilennummern), sehen Sie sowohl die < and the > Schild. Wenn das Hinzufügen von Inhalten ( „a“ zwischen den Zeilennummern), werden Sie nur die> Zeichen sehen, und beim Löschen von Inhalten (ein „d“ zwischen den Zeilennummern) nur dem < sign.
Die „“, gefolgt von „No Newline am Ende der Datei“ gibt es nur, weil ich nicht nach der Eingabe der Wörter eingeben gedrückt haben. Im Allgemeinen ist es immer sinnvoll, eine endgültige Newline zu jeder Textdatei hinzufügen, die Sie erstellen. Bestimmte Teile der Software kann ohne sie nicht tun. Daher wird das Fehlen einer abschließenden Newline so explizit durch diff berichtet. Hinzufügen endgültige Zeilenumbrüche zu den Dateien macht die Ausgabe viel kürzer:
1C1
< These are a few words.
-
> Diese sind immer noch nur ein paar Worte.
Wenn wir einen Patch erstellen möchten, sollten wir die Ausgabe von diff in eine Datei setzen. Natürlich könnten Sie dies tun, indem die Ausgabe von der Konsole kopieren und, nachdem sie in Ihrem bevorzugten Texteditor einfügen, die Datei zu speichern, aber es gibt einen kürzeren Weg. Wir können bash Schreib diff die Ausgabe in eine Datei für uns diese Art und Weise lassen:
Auch hier ersetzt die Dateinamen mit den in Ihrem Fall Appropiate. Sie könnten wissen, dass bash, das ein Befehls der Ausgabe in eine Datei zu schreiben, mit> funktioniert mit jedem Befehl. Dies kann sehr nützlich sein, um Ausgabe eines Befehls an eine (log) Datei zu speichern.
Glückwünsche! Wenn diff die Dateien gemeldet gleich sein, die Sie gerade erfolgreich erstellt und verwendet einen Patch! Allerdings haben wir das Patch-Format nur verwendet wird, ist nicht die einzige. Im nächsten Kapitel werde ich über ein anderes Patch-Format erklären.
Im ersten Kapitel haben wir einen Patch normales Format des mit diff. Dieses Format, liefert jedoch keine der Zeilen Kontext um denjenigen ersetzt werden, und daher eine Änderung der Zeilennummern (eine oder mehr zusätzliche Zeilenumbrüche irgendwo, oder einige Zeilen gelöscht) wäre es sehr schwierig für das Patch-Programm, um zu bestimmen, anstatt die Linien zu ändern. Auch wenn eine andere Datei, die zufällig ausgebessert wird, um die gleichen Linien wie die Originaldatei an den richtigen Stellen enthält, wird Patch glücklich die Patchdatei der Änderungen in diese Datei gelten. Dies könnte in gebrochenem Code und anderen unerwünschten Nebenwirkungen zur Folge hat. Glücklicherweise unterstützt diff andere Formate als die normale. Lassen Sie uns einen Patch für die gleichen Dateien erstellen, aber dieses Mal das Kontextausgabeformat:
Mittlerweile sollte klar sein, dass Sie die Dateinamen ersetzen sollten, wenn notwendig =). Sie sollten eine Ausgabe wie diese:
Wie Sie sehen können, werden die Dateinamen enthalten. Dies wird uns etwas Tipp sparen, wenn Sie den Patch angewendet. Der Zeitstempel Sie neben den Dateinamen sehen kann, ist das Datum und die Uhrzeit der letzten Änderung der Datei. Die Linie mit 15 * 's zeigt den Start eines großes Stück. Ein großes Stück beschreibt, welche Änderungen, wie Ersatz, Ergänzungen und Streichungen, sollte zu einem bestimmten Textblock gemacht werden. Die beiden Zahlen 1 sind Zeilennummern (wieder, können diese auch seinen Leitungsbereich (12,15 Mittel 12, Zeile 15) zur Leitung), und. bedeutet, dass die Linie ersetzt werden soll. Die Linie mit ein. vor dem drei -'s (hey, wo haben wir das vor? sehen) soll durch die zweite Leitung mit einem ersetzt werden. nach den drei -'s (. natürlich die selbst nicht enthalten sein, es ist Kontext-Format-Syntax).
Wie Sie sehen können, gibt es keine c ist, ein von und d's hier. Die Aktion durchzuführen ist durch die Zeichen vor der Zeile bestimmt. Das. wie erläutert, bedeutet, daß die Linie ersetzt werden sollte. Die anderen verfügbaren Zeichen sind +, - und““ (Leerzeichen). Das + bedeutet hinzufügen (oder anhängen), die - Mittel löschen, und das Symbol““ bedeutet nichts: Patch wird es nur als Kontext verwenden sicher zu sein, es ist der richtige Teil der Datei zu ändern.
Anwendung dieses Patches ist ein bisschen einfacher: unter den gleichen Umständen wie zuvor (lassen bash die diff Ausgabe in eine Datei wieder, dann kopieren Sie die Patchdatei und die Originaldatei zu einem anderen Ort schreiben), werden Sie ausführen müssen:
Der einfachste Weg, um die Unterschiede zwischen mehreren Dateien zu erhalten ist, sie alle in einem Verzeichnis zu setzen und lassen diff die ganzen Verzeichnisse vergleichen. Sie können nur Verzeichnisse anstelle von Dateien angeben, diff wird automatisch erkennen, ob Sie eine Datei oder ein Verzeichnis sind zu geben:
Hinweis: Wenn die Verzeichnisse Sie vergleichen auch Unterverzeichnisse enthalten, sollten Sie die Option -r hinzufügen diff die Dateien in einem Unterverzeichnis vergleichen zu machen, auch.
Dies sollte eine Ausgabe wie folgt ergeben:
Wie Sie sehen können, gibt das normale Ausgabeformat nur Dateinamen, wenn mehrere Dateien zu vergleichen. Sie können auch Beispiele für das Hinzufügen und Löschen von Linien sehen.
Nun lassen Sie sich am Ausgang des gleichen Vergleichs im Zusammenhang Format einen Blick:
- Wir werden etwas in dieser Datei hinzufügen und diese Zeile zu löschen.
Es wird etwas oberhalb dieser Linie hinzugefügt werden.
Das erste, was Sie bemerken sollten, ist Zunahme der Länge; das Kontext-Format bietet mehr Informationen als das normale Format. Das war sicherlich nicht sichtbar im ersten Beispiel, wie es kein Zusammenhang war zu schließen. Allerdings gibt diesmal war Kontext, und das lenghtens sicherlich den Patch viel. Vielleicht haben Sie auch bemerkt haben, dass die Dateinamen zweimal jedes Mal erwähnt werden. Dies wird wahrscheinlich entweder getan, um es einfacher für Patch zu erkennen, wann die nächste Datei Patchen zu starten, oder besser Rückwärtskompatibilität (oder beides) zu liefern.
Der andere Weg diff mehrere Dateien vergleichen zu lassen, schreibt ein Shell-Skript, das diff mehrere Male ausgeführt wird und fügt korrekt die gesamte Ausgabe in eine Datei, einschließlich der Zeilen mit den Diff-Befehle. Ich werde Ihnen nicht sagen, wie dies als die andere Art und Weise zu tun (die Dateien in einem Verzeichnis setzen) viel einfacher ist und weit verbreitet ist.
diesen Patch mit diff herzustellen war beträchtlich einfach, aber die Verwendung von Verzeichnissen Kicks in einem neuen Problem: wird nur die genannten Dateien im aktuellen Arbeitsverzeichnis und vergessen Sie das Verzeichnis sie waren bei der Erstellung des Patch, oder wird es patchen die Patch Patch Dateien innerhalb der im Patch angegebenen Verzeichnisse? Werfen Sie einen Blick auf das nächste Kapitel, um herauszufinden!
Im Kapitel vor diesem, haben wir einen Patch, der mehrere Dateien patchen verwendet werden kann. Wenn Sie dies noch nicht getan haben, diff die Ausgabe auf einen tatsächlichen Patchdatei in einer Weise, wie dies sparen:
Hinweis: wir werden das Kontext Format Patch hier verwenden, da es im Allgemeinen gute Praxis ist es, ein Format zu verwenden, die den Kontext zur Verfügung stellt.
Es ist Zeit, unsere Patchdatei zu versuchen, mit. Kopieren Sie das ursprüngliche Verzeichnis und die Patchdatei an einen anderen Ort, gehen Sie zu diesem anderen Ort, und wenden Sie den Patch mit diesem Befehl:
] $ Patch -i patchfile.patch
Huh? Er berichtet, dass es nicht die Datei patchen finden kann! Ja, das ist richtig. Es wird versucht, die Datei file1 im aktuellen Verzeichnis zu finden (Patch defaultly Streifen alle Verzeichnisse vor dem Dateinamen entfernt). Natürlich ist diese Datei nicht dort, weil wir die Datei im Verzeichnis originaldirectory zu aktualisieren versuchen. Aus diesem Grund sollten wir Patch sagen keine Verzeichnisse in den Dateinamen abstreifen. Das kann auf diese Weise geschehen:
] $ Patch -p0 -i patchfile.patch
Hinweis: Sie könnte denken, man könnte auch nur in originaldirectory bewegen und den Patch-Befehl dort ausführen. Bloß nicht! Dies ist eine schlechte Praxis: Wenn die Patchdatei alle Dateien enthält in Unterverzeichnisse Patch, Patch für sie im Arbeitsverzeichnis aussehen wird, und, natürlich, sie nicht oder die falschen finden finden. Verwenden Sie die Option -p Patch Blick in den Unterverzeichnissen, wie es sollte zu machen.
] $ Patch -p0 -R -i patchfile.patch
Normalerweise wird dieser Vorgang erfolgreich zu sein, und Sie werden die Originaldateien wieder Sie haben. By the way, gibt es einen anderen Grund, warum Sie wollen würde einen Patch umkehren: manchmal (vor allem, wenn schläfrig), lassen die Menschen einen Patch mit den tauschte Dateien. Sie haben eine große Chance, dass Patch diese automatisch erkennt und fragen Sie, wenn Sie es wollen, in umgekehrter Richtung versuchen, das Patchen. Manchmal jedoch Patch erkennt sie nicht und fragen sich, warum die Dateien nicht übereinstimmen scheinen. Sie können dann versuchen, den Patch in umgekehrter Weise der Anwendung manuell, indem Sie die Option -R vorbei zu patchen. Es empfiehlt sich, eine Sicherungskopie zu machen, bevor Sie versuchen, diese, wie es möglich ist, dass Patch vermasselt und lässt Sie mit unwiederbringlich verdorben Dateien.
Der Befehl diff kann auch die Unterschiede in einem anderen Format ausgegeben: das einheitliche Format. Dieses Format ist kompakter, da sie redundante Kontextzeilen und Gruppen Dinge wie Zeilennummer Anweisungen auslässt. Jedoch wird dieses Format derzeit nur von GNU diff und Patch unterstützt. Wenn Sie einen Patch in diesem Format veröffentlicht seine, sollten Sie sicher sein, dass es nur durch GNU Patch Benutzer angewendet werden. So ziemlich jeder Linux Geschmack bietet GNU Patch.
Das einheitliche Format ähnelt dem Kontext-Format, aber es ist weit von genau derselben. Sie können auf diese Weise einen Patch im einheitlichen Format erstellen:
Die Ausgabe sollte wie folgt sein:
-Wir werden etwas in dieser Datei hinzufügen und diese Zeile zu löschen.
Es wird etwas oberhalb dieser Linie hinzugefügt werden.
Nach etwa drei Formaten lesen, fragen Sie sich wahrscheinlich, welche man wählen. Hier ist ein kleiner Vergleich:
- Das normale Format bietet die beste Kompatibilität: ziemlich jeder diff / patch-ähnlichen Befehl es erkennen soll. Der Mangel an Kontext ist ein großer Nachteil, wenn.
- Das Kontext Format wird allgemein unterstützt, wenn nicht jeder diff / patch-ähnlichen Befehl weiß es. Allerdings macht der Vorteil in der Lage zu zählen Kontext das wieder wett.
- Das einheitliche Format bietet dabei auch, und ist kompakter als Kontext-Format, sondern nur durch eine einzige Marke von diff / patch-ähnlichen Befehlen unterstützt.
Wenn Sie sicher sind, dass der Patch nur von GNU diff / Patch-Benutzer verwendet werden, Unified ist die beste Wahl, da es Ihren Patch so kompakt wie möglich hält. In den meisten anderen Fällen jedoch ist das Kontext-Format die beste Wahl. Das normale Format sollte nur verwendet werden, wenn Sie sicher sind, gibt es einen Benutzer ohne Kontext-Format unterstützen.
Es ist möglich, diff weniger Zeilen Kontext zu machen ist rund um die Zeilen, die geändert werden sollen. Vor allem in großen Patchdateien, kann dies eine Menge von Bytes abstreifen und machen Sie Ihre Patchdatei mehr tragbar. wenn Sie zu wenigen Zeilen Kontext umfassen jedoch, Patch möglicherweise nicht korrekt funktionieren. Unter Angabe der GNU diff-man-Seite: „Für einen ordnungsgemäßen Betrieb Patch benötigt typischerweise mindestens zwei Zeilen Kontext.“
die Menge der Kontextzeilen Angabe kann auf mehrere Arten erfolgen:
- Wenn Sie das Kontextformat verwenden möchten, können Sie es in eine Option kombinieren, die -C-Option. Beispiel:
Der obige Befehl würde das einheitliche Format mit 2 Kontextzeilen verwenden.
Dies wird jedoch nur funktionieren, wenn Sie auch ein Kontexttragenden Format angeben. Sie müßten diese Option kombinieren, entweder mit -c oder -u.
Obwohl dieses Tutorial eine Menge Features und Funktionsweise von diff und Patch beschreibt, hat es bei weitem nicht alles beschreiben Sie mit diesen leistungsfähigen Werkzeugen zu tun. Es ist eine Einführung in Form eines Tutorials. Wenn Sie mehr über diese Befehle wissen wollen, können Sie lesen, zum Beispiel ihre manpages und Dokumentation des GNU über diff und Patch.