patch(1) patch(1)
NAME
patch - Diff-Liste anwenden
SYNTAX
patch [option ...] [datei] [+ [option ...] [datei]]
BESCHREIBUNG
patch verwendet eine Korrekturdatei (patch file) mit einer der drei
Arten von Deltalisten (normal, mit Kontextangabe oder im ed-Format),
die vom Kommando diff(1) erstellt werden, und wendet diese Deltas auf
eine Originaldatei an, wodurch eine korrigierte Version erstellt wird.
Standardmäßig wird die Originaldatei durch die korrigierte Version
ersetzt. Wenn Sie die Option -b angeben, wird die Originaldatei unter
demselben Namen mit der Erweiterung .orig gesichert. Mit der Option -o
können Sie darüber hinaus eine Datei angeben, in die die Ausgabe
geschrieben werden soll.
patch versucht beim Start, die Art der Diff-Liste festzustellen,
sofern diese nicht bereits über die Option -c, -e oder -n festgelegt
wurde. Diff-Listen mit Kontextangabe und normale Diff-Listen werden
vom Kommando patch direkt angewandt, während mit der Option -e
erstellte Diff-Listen einfach über eine Pipe an den Editor ed(1) wei-
tergeleitet werden.
Enthält die Korrekturdatei zusätzlichen Text vor und/oder nach den
Korrekturanweisungen, wird dieser von patch übersprungen. Wenn die
gesamte Diff-Liste bis zu einer bestimmten Spalte eingerückt ist, wird
dies berücksichtigt.
Bei Diff-Listen mit Kontextangabe und teilweise auch bei normalen
Diff-Listen kann patch inkorrekte Zeilennummern in den Korrekturanwei-
sungen feststellen und versucht, die korrekte Position zu ermitteln,
um den entsprechenden Korrekturblock anzuwenden. Zuerst verwendet
patch die für den Block angegebene Zeilenzahl plus/minus dem Offset,
der bei der Anwendung des vorherigen Blocks verwendet wurde. Wenn dies
nicht die korrekte Position ist, sucht patch max. 1000 Byte vorwärts
und rückwärts nach einer Gruppe von Zeilen, die mit dem Kontext des
entsprechenden Blocks übereinstimmen. Zuerst sucht patch nach einer
Position, an der alle Zeilen des Kontextes übereinstimmen. Wenn eine
solche Position bei einer Diff-Liste mit Kontextangabe nicht gefunden
wird und der maximale Ungenauigkeitsfaktor auf 1 oder größer gesetzt
ist, wird ein weiterer Suchlauf durchgeführt, in dem die erste und die
letzte Kontextzeile ignoriert werden. Wenn dieser Suchlauf fehlschlägt
und der maximale Ungenauigkeitsfaktor auf 2 oder größer gesetzt ist,
werden die ersten beiden und die letzten beiden Kontextzeilen in einem
weiteren Suchlauf ignoriert. (Der standardmäßige maximale Ungenauig-
keitsfaktor ist 2.)
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
patch(1) patch(1)
Kann patch trotzdem keine Position finden, an der der Korrekturblock
angewendet werden kann, schreibt es den Block in eine Fehlerdatei. Die
Datei enthält alle zurückgewiesenen Blöcke und erhält normalerweise
den Namen der Ausgabedatei mit dem Suffix .rej. Der zurückgewiesene
Block wird mit Kontextangabe ausgegeben, unabhängig von der Form der
Korrekturanweisung. Handelt es sich bei der Eingabe um eine normale
Diff-Liste, fehlen eventuell die Kontextangaben. Die Zeilennummern der
Korrekturblöcke in der Fehlerdatei können sich von denen in der Kor-
rekturdatei unterscheiden: Sie geben die ungefähre Position in der
neuen Datei wieder, an der patch die zurückgewiesenen Blöcke vermutet,
nicht in der alten.
Wenn patch einen Korrekturblock abgearbeitet hat, werden Sie darüber
informiert, ob der Block erfolgreich angewendet oder zurückgewiesen
wurde. Darüber hinaus wird auch die Zeile (der neuen Datei) ausgege-
ben, in der patch den Block angewendet hat. Wenn sich die Zeilennummer
von der in der Diff-Liste angegebenen Zeilennummer unterscheidet, wird
Ihnen der Offset mitgeteilt. Ein einzelner großer Offset kann ein Hin-
weis darauf sein, daß der Block an der falschen Position angewendet
wurde. Sie werden auch darüber informiert, wenn für die Suche ein
Ungenauigkeitsfaktor verwendet wurde. In diesem Fall sollten Sie eben-
falls vorsichtig sein.
Wird patch mit einer ed-Liste aufgerufen, dann wird diese Liste an den
Editor ed(1) weitergeleitet. Fehlerhafte ed-Anweisungen können nicht
diagnostiziert werden, so daß in diesem Fall keine Fehlerdatei .rej
angelegt und auch kein Status 1 zurückgeliefert wird (siehe ENDESTA-
TUS).
Ist keine Originaldatei angegeben, versucht patch den Namen der zu
editierenden Datei anhand des Vorspanns festzustellen. Im Kopf einer
Diff-Liste mit Kontextangabe findet sich der Dateiname in den mit
"***" oder "---" beginnenden Zeilen. Kann patch den Dateinamen so
nicht feststellen, sucht es nach einer Zeile "Index:" und versucht den
in dieser Zeile enthaltenen Dateinamen zu verwenden. Gefundene Datei-
namen werden dabei entsprechend der Option -p verkürzt. patch sucht
die Datei(en) im aktuellen Verzeichnis (bzw. in dem bei -d angegebenen
Verzeichnis). Wenn die Originaldatei nicht gefunden werden kann,
jedoch eine passende SCCS- oder RCS-Datei vorliegt, versucht patch,
diese Datei herauszuholen und zu editieren. Wird im Vorspann kein
Dateiname erkannt, werden Sie aufgefordert, den Namen der zu korrigie-
renden Datei einzugeben.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
patch(1) patch(1)
Wenn der Vorspann eine Zeile "Prereq: " enthält, verwendet patch das
erste Wort dieser Zeile (normalerweise handelt es sich hierbei um eine
Versionsnummer) und prüft, ob dieses Wort in der Eingabedatei vor-
kommt. Wenn dies nicht der Fall ist, fordert patch vor seiner weiteren
Ausführung eine Bestätigung an.
Wenn die Korrekturdatei mehr als ein Korrektur-Script enthält, ver-
sucht patch, alle Korrektur-Scripts so anzuwenden, als stammten sie
aus verschiedenen Korrekturdateien. D. h. patch versucht für jedes
Korrektur-Script den Namen der zu korrigierenden Datei festzustellen
und untersucht den Vor- und Nachspann vor jedem Korrektur-Script auf
relevante Angaben (wie z. B. Dateinamen und Änderungsstand). Sie kön-
nen Optionen (z. B. einen anderen Originaldateinamen) für das zweite
und weitere Korrektur-Scripts angeben, indem Sie die entsprechenden
Argumentlisten durch ein "+" trennen.
OPTIONEN
Die Optionen -c, -e und -n können nicht zusammen verwendet werden.
-b Alle Originaldateien werden mit Suffix .orig gesichert, bevor die
Korrekturanweisungen angewendet werden. Existiert die Sicherungs-
datei bereits, wird sie überschrieben; bei mehreren Korrekturläu-
fen wird nur beim ersten eine Sicherungsdatei angelegt. Wenn Sie
zusätzlich die Option -o angeben, wird nicht die Originaldatei
gesichert, sondern die Ausgabedatei, falls sie bereits existiert.
-B sicherung
Die Originaldatei wird unter sicherung.orig gesichert, bevor die
Korrekturanweisungen angewendet werden.
-c Interpretiert die Korrekturdatei als Diff-Liste mit Kontextangabe
(Ausgabe von diff, wenn -c oder -C angegeben wurde).
-d verzeichnis
patch wechselt vor weiteren Aktionen in das Verzeichnis
verzeichnis.
-D define
Markiert Änderungen bei dem C-Präprozessor-Konstrukt:
#ifdef define
...
#endif
Das Argument define wird als Unterscheidungssymbol verwendet.
Beachten Sie, daß sich, anders als beim C-Compiler, zwischen der
Option -D und dem Argument ein Leerzeichen befinden muß.
-e Interpretiert die Korrekturdatei als ein ed-Script.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
patch(1) patch(1)
-f patch stellt keine Rückfragen an den Benutzer. Diese Option
unterdrückt jedoch keine Kommentare. Verwenden Sie dazu die
Option -s.
-F zeilen
Stellt den maximalen Ungenauigkeitsfaktor ein. Diese Option gilt
nur für Diff-Listen mit Kontextangabe. Wenn diese Option angege-
ben ist, ignoriert patch bei der Suche nach einem passenden Kon-
text maximal diese Anzahl von Zeilen in der Kontextangabe. Beach-
ten Sie, daß ein größerer Ungenauigkeitsfaktor die Wahrschein-
lichkeit einer fehlerhaften Korrektur erhöht. Der standardmäßige
Ungenauigkeitsfaktor ist 2. Er kann maximal auf die Anzahl der
Kontextzeilen einer Diff-Liste mit Kontextangabe gesetzt werden
(in der Regel 3).
-i korrekturdatei
patch liest die Korrekturanweisungen aus der Datei korrekturda-
tei. Wenn Sie für korrekturdatei einen Bindestrich angeben, liest
patch von der Standardeingabe.
Eine Korrekturdatei enthält ein oder mehrere Korrektur-Scripts,
eventuell zusammen mit Zusatzinformationen. Enthält eine Korrek-
turdatei mehrere Korrektur-Script, sollte jedes Script Informa-
tionen über Dateinamen enthalten (wie bei diff -c entstanden),
damit patch die betroffenen Dateien automatisch finden kann.
patch wertet folgende Informationen aus:
Index: pfadname
pfadname benennt die zu korrigierende Datei
*** pfadname
pfadname gibt die "alte" Datei an, auf deren Grundlage das
Korrektur-Script entstanden ist
--- pfadname
pfadname gibt die zu korrigierende Datei an (die Angabe hat
Vorrang vor Index:)
Jedes Korrektur-Script enthält Korrekturanweisungen, die einer
der drei Arten von Diff-Listen entsprechen.
-i nicht angegeben: patch liest von der Standardeingabe.
-l Eine beliebige Folge von Tabulator- und Leerzeichen in der Kor-
rekturdatei paßt zu einer beliebigen Folge von Tabulator- und
Leerzeichen in der Eingabedatei. Bei normalen Zeichen muß jedoch
weiterhin eine exakte Übereinstimmung vorliegen.
-n Interpretiert die Korrekturdatei als eine normale Diff-Liste.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
patch(1) patch(1)
-N Ignoriert Korrekturanweisungen, die bereits angewandt wurden.
Standardmäßig werden solche Korrekturanweisungen zurückgewiesen.
-o ausgabedatei
Die korrigierte Version wird in ausgabedatei geschrieben. Mehrere
korrigierte Dateien werden dabei aneinandergehängt. Betreffen
verschiedene Korrektur-Scripts dieselbe Originaldatei, werden die
folgenden Scripts jeweils auf eine Zwischendatei angewendet. Ent-
sprechend werden mehrere Versionen der Originaldatei nach ausga-
bedatei geschrieben.
-p zahl
Steuert die Behandlung von in der Korrekturdatei gefundenen Pfad-
namen. zahl gibt an, wieviele Schrägstriche vom Anfang des Pfad-
namens entfernt werden sollen. (Alle dazwischenliegenden Ver-
zeichnisnamen werden ebenfalls entfernt.) Bei relativen Pfadnamen
erfolgt die Suche im aktuellen Verzeichnis oder in dem mit der
Option -d angegebenen Verzeichnis.
-p nicht angegeben: Es wird nur der Basisname ohne Pfad verwendet.
Beispiel: Angenommen, der Dateiname in der Korrekturdatei wäre
/u/howard/src/blurfl/blurfl.c
Setzen der Option -p 0 läßt den gesamten Pfadnamen unverändert.
Das Setzen der Option -p 1 entfernt den führenden Schrägstrich im
Pfadnamen:
u/howard/src/blurfl/blurfl.c
Die Angabe der Option -p 4 ergibt den folgenden Pfadnamen:
blurfl/blurfl.c
Wird die Option -p nicht angegeben, wird der Pfadname auf
blurfl.c gekürzt.
-r fehlerdatei
Gibt die Datei an, in der die zurückgewiesenen Korrekturanweisun-
gen gesammelt werden sollen.
-r nicht angegeben:
Die zurückgewiesenen Korrekturen werden in einer Datei gesammelt,
die denselben Namen hat wie die Ausgabedatei, jedoch mit dem Suf-
fix .rej versehen ist.
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
patch(1) patch(1)
-R patch soll den Sinn der Korrekturanweisungen umkehren, bevor sie
auf die Originaldatei angewandt werden. Dies ist nötig, wenn die
alten und neuen Dateien beim Erstellen der Korrektur vertauscht
wurden. patch versucht, jeden Korrekturblock umzukehren, bevor er
angewandt wird. Zurückgewiesene Korrekturanweisungen werden im
umgekehrten Format in die Fehlerdatei geschrieben. Die Option -R
kann nicht bei ed-Scripts verwendet werden, da die Informationen
zur Rekonstruktion der umgekehrten Korrekturanweisungen nicht
ausreichen.
Kann der erste Korrekturblock einer Korrekturdatei nicht angewen-
det werden, kehrt patch den Sinn der Korrekturanweisungen um und
versucht, ihn auf diese Weise anzuwenden. Ist dies möglich, wer-
den Sie gefragt, ob die Option -R gesetzt werden soll. Ist dies
nicht möglich, trägt patch den Block in die Fehlerdatei ein und
fährt normal fort. (Hinweis: Umgekehrte Korrekturanweisungen kön-
nen mit dieser Methode nicht erkannt werden, wenn es sich um eine
normale Diff-Liste handelt und das erste Kommando eine Einfügung
ist, also eigentlich ein Löschvorgang sein sollte.)
-s patch gibt keine Meldungen aus, sofern kein Fehler auftritt.
-S Enthält eine Korrekturdatei mehrere Korrektur-Scripts, kann mit
-S ein Script übersprungen werden. Auf die Originaldatei wird
dann das nächste Script angewendet.
patch -S + -S + datei
ignoriert z. B. die ersten beiden von insgesamt drei Korrektur-
Scripts.
-v Gibt Informationen über die Version des aktiven Programms patch
aus.
-x flag
Setzt interne Flags für die Testhilfe. Diese Option kann zum Test
der Korrekturdatei verwendet werden.
datei
Pfadname der zu korrigierenden Datei.
datei nicht angegeben:
patch versucht, den Dateinamen aus dem Vorspann zu den Korrektur-
anweisungen zu ermitteln.
HINWEISE ZUR ARBEIT MIT PATCH
Wenn Sie regelmäßig Korrekturdateien erstellen, empfiehlt es sich, als
erste Korrekturanweisung die Änderungsstufe mitzuführen. Wenn Sie eine
Zeile "Prereq: " in die Korrekturdatei stellen, können Sie verhindern,
daß Benutzer falsche Korrekturen anwenden, ohne gewarnt zu werden.
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
patch(1) patch(1)
Prüfen Sie, ob Sie im Kopf einer Diff-Liste mit Kontextangabe oder in
der Zeile "Index:" die Dateinamen korrekt angegeben haben. Wenn Sie
Korrekturen in einem Unterverzeichnis durchführen wollen, teilen Sie
dem Korrekturbenutzer mit, daß die Option -p entsprechend angegeben
werden muß.
Vermeiden Sie möglichst umgestellte Korrekturen.
Stellen Sie zusammengehörende Korrekturen für den Fall eines Fehlers
möglichst in separate Dateien.
Werden Fehlerdateien mit zurückgewiesenen Korrekturblöcken erstellt,
beendet sich patch mit einem Status ungleich null. Wenn Sie eine Reihe
von Korrekturen in einer Schleife anwenden, sollten Sie diesen Ende-
status prüfen, damit eine spätere Korrektur nicht auf einer nur teil-
weise korrigierten Datei durchgeführt wird.
Wenn Code dupliziert wurde (zum Beispiel mit "#ifdef OLDCODE ... #else
... #endif"), kann patch nicht beide Versionen korrigieren. Wenn das
Kommando überhaupt ausgeführt werden kann, korrigiert es möglicher-
weise die falsche Version, und informiert Sie darüber, daß die Korrek-
turen erfolgreich abgearbeitet wurden.
Wenn Sie eine bereits angewandte Korrektur nochmals anwenden, nimmt
patch an, daß es sich um eine umgekehrte Korrektur handelt und bietet
die Zurücknahme der Korrektur an.
UMGEBUNGSVARIABLEN
Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kom-
mandos patch:
LANG Gibt einen Standardwert für die Internationalisierungsva-
riablen an, die nicht gesetzt oder null sind. Ist LANG
nicht gesetzt oder null, wird der entsprechende Standard-
wert der internationalen Umgebung verwendet. Enthält eine
der Internationalisierungsvariablen eine ungültige Ein-
stellung, verhält sich das Kommando so, als wäre keine
der Variablen definiert.
LCALL Ist diese Variable auf einen Wert gesetzt, d. h. ist sie
nicht leer, überschreibt dieser Wert die Werte aller
übrigen Internationalisierungsvariablen.
LCCTYPE Legt die die Interpretation von Byte-Folgen als Zeichen
fest (z. B. Einzelbytezeichen im Unterschied zu Mehrbyte-
zeichen in Argumenten).
LCMESSAGES Legt das Format und den Inhalt von Meldungen fest.
NLSPATH Legt die Position der Meldungskataloge für die Verarbei-
tung von LCMESSAGES fest.
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98
patch(1) patch(1)
ENDESTATUS
0 Erfolgreiche Beendigung.
1 Eine oder mehrere zurückgewiesene Korrekturanweisungen wurden in
die Fehlerdatei geschrieben.
>1 Ein Fehler ist aufgetreten.
DATEIEN
/tmp/patch*
SIEHE AUCH
diff(1), ed(1).
Seite 8 Reliant UNIX 5.44 Gedruckt 11/98