Patch - Unix, Linux Command
Patch - eine Diff-Datei auf ein Original anwenden
Patch [Optionen] [originalfile [Patchdatei]]
aber in der Regel nur
Patch nimmt eine Patch-Datei Patchdatei einen Unterschied enthält, von dem Programm diff erzeugt Inserat und wendet diese Unterschiede zu einem oder mehreren Original-Dateien, gepatchte Versionen produziert. Normalerweise werden die gepatchten Versionen anstelle der Originale setzen. Backups können vorgenommen werden; siehe -b oder --backup Option. Die Namen der Dateien sind in der Regel von der Patch-Datei genommen gepatcht werden, aber wenn es # 146; s nur eine Datei kann auf der Kommandozeile als originalfile angegeben gepatcht werden.
Beim Start versucht Patch den Typ des diff-Eintrag, um zu bestimmen, es sei denn durch eine -C (--context) außer Kraft gesetzt, -e (Verf), -n (--normal) oder -u (--unified) Option. Context Differentiale (old-style, neuer Stil und Unified) und normale Differentiale werden durch das Patch-Programm selbst angelegt, während ed diffs einfach an der ED zugeführt werden (1) über ein Rohr Editor.
Patch versucht jeden führenden Müll zu überspringen, wendet das diff und dann jeden nachlauf garbage überspringt. So könnten Sie einen Artikel oder eine Nachricht füttern ein Diff-Eintrag Patch enthält. und es sollte funktionieren. Wenn die gesamte diff durch eine konsistente Menge eingekerbt, oder wenn ein Kontext diff enthält Zeilen in CRLF endet oder ein oder mehrere Male eingekapselt durch das Voranstellen „-“ auf Linien, die mit „-“ von Internet RFC 934 angegeben ist, wird diese genommen Rechnung trägt.
Wenn keine Originaldatei origfile auf der Befehlszeile angegeben wird, versucht Patch von dem führenden Müll, um herauszufinden, was der Name der Datei zu bearbeiten, die folgenden Regeln.
Zuerst nimmt Patch eine geordnete Liste von Kandidaten-Dateinamen wie folgt:
Wenn der Header der eines Kontext diff ist, nimmt Patch die alten und neuen Dateinamen in der Kopfzeile. Ein Name wird ignoriert, wenn es nicht genug Schrägstriche hat die -pnum oder --strip = num Option zu erfüllen. Der Name / dev / null wird ebenfalls ignoriert.
Wenn es einen Index: Zeile in der führenden Müll und wenn entweder die alten und neuen Namen beide abwesend sind oder wenn Patch POSIX konform ist. Patch nimmt den Namen im Index: Zeile.
Für die Zwecke der folgenden Regeln werden die Kandidaten Dateinamen betrachtet in der Reihenfolge (alt, neu, Index) zu sein, unabhängig von der Reihenfolge, dass sie in der Kopfzeile angezeigt.
Dann wählt Patch einen Dateinamen aus der Liste Kandidaten wie folgt:
Wenn einige der benannten Dateien vorhanden sind, wählt Patch den ersten Namen, wenn POSIX konform. und der beste Name anders.
Wenn Patch nicht RCS ignorieren. Clearcase und SCCS (siehe -gnum oder --get = num Option), und es werden keine Dateien mit dem Namen existieren, aber ein RCS. Clearcase oder SCCS Master gefunden wird, Patch wählt die erste benannte Datei mit einem RCS. Clearcase oder SCCS Master.
Wenn keine Dateien mit dem Namen vorhanden ist, kein RCS. Clearcase oder SCCS Meister wurde gefunden, einige Namen gegeben werden, wird Patch nicht zu POSIX entspricht. und der Patch erscheint eine Datei zu erstellen, Patch wählt die besten Namen erfordern die Schaffung von den wenigstenen Verzeichnissen.
Wenn kein Dateiname aus den oben genannten Heuristiken führt, werden Sie nach dem Namen der Datei aufgefordert zu flicken, und Patch wählt diesen Namen.
das Beste aus einer nicht leeren Liste von Dateinamen, um zu bestimmen, Patch zuerst mit den wenigstenen Pfadnamen Komponenten alle Namen nimmt; von denen, nimmt es dann alle Namen mit den kürzesten Basisnamen; von denen, dauert es dann alle kürzesten Namen; Schließlich nimmt sie den ersten verbleibenden Namen.
Das Ergebnis von all dem ist, dass Sie in der Lage sein sollte, zu sagen, während sie in einer Nachrichten-Schnittstelle, etwa wie folgt:
| Patch -d / usr / src / local / blurfl
und Patch eine Datei im Verzeichnis blurfl direkt aus dem Artikel mit dem Patch.
Wenn die Patch-Datei mehr als ein Patch enthält, versucht Patch jeden von ihnen gelten als ob sie aus separaten Patch-Dateien kamen. Das bedeutet unter anderem, dass man davon ausgeht, dass der Name der Datei Patch für jede diff Auflistung bestimmt werden muss, und dass der Müll vor jeder diff Auflistung interessante Dinge wie Dateinamen und Revisionsstufe enthält, wie zuvor erwähnt.
-E oder --remove-empty-Dateien
Entfernen Sie die Ausgabedateien, die leer sind, nachdem die Patches angewendet wurden. Normalerweise ist diese Option nicht erforderlich, da Patch die Zeitstempel auf dem Kopf untersuchen kann, um zu bestimmen, ob eine Datei nach dem Patchen existieren sollte. Wenn jedoch der Eingang ist kein Kontext diff oder wenn Patch POSIX konform ist. Patch entfernt nicht leer gepatchten Dateien, wenn diese Option angegeben wird. Wenn Patch eine Datei entfernt, es versucht, auch alle leeren Vorfahren Verzeichnisse zu entfernen.
Diese Option steuert Patch # 146; s Aktionen, wenn eine Datei unter RCS oder SCCS Kontrolle ist, und existiert nicht oder ist schreibgeschützt und entspricht die Standardversion, oder wenn eine Datei ist unter Kontrolle und Clearcase nicht existiert. Wenn num positiv ist, wird Patch (oder auscheckt), um die Datei aus dem Versionskontrollsystem; Wenn Null, ignoriert Patch RCS. Clearcase und SCCS und wird nicht die Datei; und wenn sie negativ ist, Patch fragt den Benutzer, ob die Datei zu erhalten. Der Standardwert dieser Option wird durch den Wert des PATCH_GET Umgebungsvariable gegeben, wenn es gesetzt ist; wenn nicht, ist der Standardwert Null, wenn Patch POSIX konform ist. ansonsten negativ.
Isolieren Sie die kleinste num führenden Schrägstriche aus jedem Dateinamen in der Patch-Datei gefunden Präfix enthält. Eine Folge von einem oder mehreren benachbarten Schrägstriche wird als einzelner Schrägstrich gezählt. Diese legt fest, wie Dateinamen in der Patch-Datei gefunden werden behandelt, falls Sie Ihre Dateien in einem anderen Verzeichnis als die Person halten, die den Patch ausgesendet. Zum Beispiel wurde den Dateinamen in der Patch-Datei angenommen
-p0 Einstellung der gesamte Dateiname unmodifizierten gibt, gibt -p1
ohne führenden Schrägstrich, bis P4 gibt
und nicht die Angabe -p überhaupt nur gibt Ihnen blurfl.c. Was auch immer Sie am Ende mit gesucht wird entweder im aktuellen Verzeichnis oder dem Verzeichnis, das von der Option -d angegeben.
Conform mehr strikt auf den POSIX-Standard, wie folgt.
Nehmen Sie die erste vorhandene Datei aus der Liste (alt, neu, Index), wenn die Dateinamen von diff Header Anschauen.
Entfernen Sie keine Dateien, die nach dem Patchen leer sind.
Es gibt mehrere Dinge, die Sie beachten sollten, wenn Sie Patches aussenden werden werden.
Erstellen Sie Ihre systematisch Patch. Eine gute Methode ist der Befehl diff neue -Naurold wo alte und neue den alten und neuen Verzeichnisse identifizieren. Die Namen alter und neuer sollten keine Schrägstriche enthalten. Der diff Befehl # 146; s Header sollte Datum und Uhrzeit in Universal Time hat mit traditionellem Unix-Format, so dass die Patch-Empfänger die -Z verwenden kann oder --set-utc Option. Hier ist ein Beispiel-Befehl, Bourne-Shell verwendet Syntax:
LC_ALL = C TZ = UTC0 diff -Naur gcc-2.7 gcc-2.8
Lassen Sie Ihre Empfänger, wie das Patch anwenden, indem Sie ihnen zu sagen, welches Verzeichnis auf CD, und welche Patch-Optionen zu verwenden. Die Option String -Np1 wird empfohlen. Testen Sie Ihre Prozedur, indem er vorgibt ein Empfänger und Anwenden Ihres Patch auf eine Kopie der Original-Dateien zu sein.
Sie können, indem sie eine patchlevel.h Datei Menschen eine Menge Ärger sparen, die das Patch-Level als das erste diff in der Patch-Datei, die Sie aussenden erhöhen gepatcht wird. Wenn Sie eine Prereq setzen: Linie mit dem Patch, gewann sie # 146; t ließ sie Patches ohne irgendeine Warnung aus, um anzuwenden.
Wenn der Empfänger soll die -pn Option verwenden, senden Sie keine Ausgabe, die wie folgt aussieht:
weil die beiden Dateinamen unterschiedliche Anzahl von Schrägstrichen haben, und verschiedene Versionen von Patch unterschiedlich die Dateinamen interpretieren. Um Verwirrung zu vermeiden, senden Ausgang, wie diese Stelle aussieht:
Vermeiden Sie Patches senden, die Backup-Dateinamen wie README.orig vergleichen. da dies könnte Patch in dem Patchen eine Backup-Datei anstelle der realen Datei verwirren. Stattdessen senden Patches, die die gleichen Basisdateinamen in verschiedenen Verzeichnissen zu vergleichen, zum Beispiel alt / README und neue / README.
Achten Sie darauf, nicht umgekehrter Patches auszusenden, da sie die Menschen sich fragen, ob sie bereits den Patch angewendet.
Versuchen Sie nicht, um Ihre Patch abgeleitete Dateien ändern (zum Beispiel der Datei configure, wo es eine Linie configure: configure.in in Ihrer Make-Datei), da sollte der Empfänger in der Lage sein, auf jeden Fall, die generierten Dateien zu regenerieren. Wenn Sie diffs abgeleiteter Dateien senden müssen, erzeugen die diffs UTC verwenden. haben die Empfänger den Patch mit der -Z oder --set-utc Option anwenden, und haben sie alle nicht gepatchten Dateien entfernen, die auf gepatchten Dateien abhängen (beispielsweise mit make clean).
Diagnose im Allgemeinen zeigen, dass Patch couldn # 146; t Ihre Patch-Datei analysieren.
Wenn die Option --verbose angegeben wird, wird die Meldung Hmm. zeigt an, dass in der Patch-Datei dort nicht verarbeiteten Text ist und dass Patch intuitiv zu erfassen versucht, ob es ein Patch in diesem Text ist, und wenn ja, welche Art von Patch ist.
Flicken # 146; s Exit-Status ist 0, wenn alle großen Stücke erfolgreich angewandt werden, 1, wenn einige großen Stücke nicht angewandt werden können, und 2, wenn es mehr ernsthafte Schwierigkeiten. Wenn eine Reihe von Patches in einer Schleife Anwendung obliegt es Ihnen, diesen Exit-Status zu überprüfen, so Sie don # 146; t einen späteren Patch auf eine teilweise geflickt Datei.
Context diffs nicht verlässlich stellen die Erstellung oder Löschung von leeren Dateien, leere Verzeichnisse oder spezielle Dateien wie symbolische Links. Auch können sie Änderungen darstellen Metadaten-Datei wie Besitzer, die Berechtigungen, oder ob eine Datei eine feste Verbindung zu einem anderen ist. Wenn Änderungen wie diese auch benötigt werden, separate Anleitung (zum Beispiel eines Shell-Skript) erreichen sie den Patch begleiten sollten.
Patch in der Regel produziert die richtigen Ergebnisse, auch wenn es viel zu raten zu tun hat. Allerdings sind die Ergebnisse nur gewährleistet, um korrekt zu sein, wenn der Patch auf genau die gleiche Version der Datei angewandt wird, dass der Patch von erzeugt wurde.
Der POSIX-Standard spezifiziert das Verhalten, das von Patch unterscheidet # 146; s traditionelles Verhalten. Sie sollten diese Unterschiede bewusst sein, wenn Sie mit Patch-Versionen 2.1 und früher zusammenarbeiten müssen, die POSIX nicht entsprechen.
In der traditionellen Patch. Die Option -p # 146; s Operand war optional, und eine nackte -p entspricht -p0. Die Option -p erfordert nun einen Operanden, und -p 0 ist nun äquivalent zu -p0. Für maximale Kompatibilität, Nutzungsmöglichkeiten wie -p0 und -p1.
Auch traditionelle Patch einfach Schrägstriche gezählt, wenn Pfad Präfixe Strippen; Patch zählt jetzt Pfadname Komponenten. Das heißt, eine Sequenz von einer oder mehreren benachbarten Schrägstriche nun als einzelner Schrägstrich zählt. Für maximale Portabilität, vermeiden Patches enthalten // in Dateinamen zu senden.
In der traditionellen Patch. Sicherungen wurden standardmäßig aktiviert. Dieses Verhalten wird nun mit der -b oder --backup Option aktiviert.
Im Gegensatz dazu in POSIX-Patch. Backups werden nie, auch wenn es eine Diskrepanz gemacht. In GNU Patch. Dieses Verhalten wird mit der --no-Backup-if-Mismatch-Option oder durch konform mit der --posix Option POSIX oder durch Einstellen des POSIXLY_CORRECT Umgebungsvariable aktiviert.
Die -bsuffix Option der traditionellen Patch ist auf die -b -zsuffix Optionen von GNU Patch-Äquivalent.
Traditionelle Patch verwendet, um einen komplizierten (und unvollständig dokumentiert) -Methode der Name der Datei Intuit aus den Patch-Header gepatcht werden. Diese Methode entsprach nicht POSIX. und hatte ein paar gotchas. Verwendet nun Patch einen anderen, gleichermaßen kompliziert (aber besser dokumentiert) -Methode, die gegebenenfalls POSIX -conforming ist; wir hoffen, dass es weniger gotchas hat. Die beiden Methoden sind kompatibel, wenn die Dateinamen im Kontext diff-Header und dem Index: Zeile alle identisch sind nach Präfix-Strippen. Ihr Patch ist normalerweise kompatibel, wenn die Kopfzeile jeder # 146; s Dateinamen alle die gleiche Anzahl von Schrägstrichen enthalten.
Wenn traditionelle Patch des Benutzer eine Frage gestellt, schickte er die Frage nach Standardfehler und suchte nach einer Antwort von der ersten Datei in der folgenden Liste, die ein Terminal war: Standardfehler, die Standardausgabe, / dev / tty. und Standardeingabe. Nun sendet Patch Fragen an die Standardausgabe und bekommt Antworten von / dev / tty. Standardwerte für einige Antworten wurden geändert, so dass Patch nie in eine Endlosschleife geht, wenn die Standardantworten verwenden.
Traditionelle Patch verließ mit einem Statuswert, der die Anzahl der schlechten großen Stücke gezählt, oder mit dem Status 1, wenn es echte Schwierigkeiten ist. Jetzt Patch Ausfahrten mit dem Status 1, wenn einige große Stücke ausgefallen ist, oder mit 2, wenn es echte Schwierigkeiten war.
Beschränken Sie sich auf die folgenden Optionen beim Senden von Anweisungen sollten von jedermann ausgeführt wird ausgeführt GNU Patch. traditionelle Patch. oder ein Patch, entspricht POSIX. Die Räume sind signifikant in der folgenden Liste, und Operanden erforderlich sind.
Wenn Code (zum Beispiel mit #ifdef OLDCODE. #else. #endif) wurde dupliziert, ist Patch unfähig, beide Versionen von Patches, und, wenn es überhaupt funktioniert, wird die falsche wahrscheinlich Patch, und Ihnen sagen, dass es gelungen ist Boot.
Wenn Sie einen Patch anwenden Sie # 146; ve bereits angewendet, Patch denkt, dass es eine umgekehrte Patch ist, und bietet den Patch un-Anwendung. Dies könnte als ein Merkmal ausgelegt werden.
Es ist erlaubt, modifizierten Versionen dieses Handbuch unter den Voraussetzungen für unverändertes Kopieren, zu erstellen und zu verteilen, sofern die gesamte resultierende abgeleitete Arbeit unter den Bedingungen einer Genehmigung auf diesen identisch verteilt ist.
Larry Wall schrieb die ursprüngliche Version von Patch. Paul Eggert entfernt Patch # 146; s willkürliche Grenzen; Unterstützung für binäre Dateien, Datei Einrichtzeiten und Löschen von Dateien; und machte es entsprechen, besser zu POSIX. Weitere Beteiligte sind Wayne Davison, die unidiff Unterstützung hinzugefügt, und David MacKenzie, die Konfiguration und Backup-Unterstützung hinzugefügt.