Сравнение и объединение файлов diff, diff3, sdiff, cmp, patch : Вызов 'patch'

Вперед Назад Содержание

15. Вызов 'patch'

Как правило, patch вызывается следующим образом:

      patch <PATCHFILE   
Полный формат для вызова patch следующий:

      patch OPTIONS... [ORIGFILE [PATCHFILE]] [+ OPTIONS... [ORIGFILE]]...   
Если Вы не указываете PATCHFILE, или если вместо PATCHFILE указан '-', patch читает файл изменений, полученный в результате работы diff, со стандартного ввода.

Вы можете указать один или более исходных файлов как аргументы ORIG; каждый из них и опции, управляющие его обработкой, отделяются друг от друга символом '+'.

Если вы не указываете входной файл в командной строке, patch пытается пропустить вводный текст, который мог быть добавлен перед началом выдачи diff, и определить имя файла для редактирования. В заголовках контекстного или унифицированного формата diff, patch пытается найти строки, начинающиеся с '***', '---' или '+++', а среди них выбирает кратчайшее имя существующего файла. В случае неудачи, если есть строка "Index:" во вводном тексте, patch пытается использовать имя файла из этой строки. Если patch не может найти таким образом имя существующего файла из вводного текста, он запрашивает имя файла для модификации у пользователя.

Если входной файл не существует, или доступ к файлу разрешен только для чтения, и существуют соответствующие RCS- или SCCS- файлы, patch пытается извлечь файлы оттуда перед обработкой.

По умолчанию, patch заменяет содержимое исходного входного файла на исправленную версию, создав предварительно резервную копию исходного входного файла. Вы можете также явно указать, куда должен быть помещен выходной файл с помощью опций -o OUTPUT-FILE или --output=OUTPUT-FILE.

15.1 Применение изменений к другим каталогам

Опция patch '-d DIRECTORY' или '--directory=DIRECTORY', делает каталог DIRECTORY текущим каталогом для интерпретации имен файлов, встречающихся в файле изменений, и имен файлом, заданных как аргументы в других опциях (таких как '-B' и '-o'). Например, находясь в программе чтения новостей, Вы можете исправить файл в каталоге /usr/src/emacs, применив изменения, присланные в статье телеконференции, непосредственно следующим образом:

      | patch -d /usr/src/emacs   
Иногда имена файлов, указанные в файле изменений, содержат ведущие имена каталогов, но Вы держите Ваши файлы в каталоге, отличном от того, что указан там. В этих случаях, Вы можете использовать опцию '-p[NUMBER]' или '--strip[=NUMBER]' для установки, какое количество / символов '/' и имен каталогов между ними должно быть отрезано от начала имени файла. '-p' без указания аргумента эквивалентно '-p0'. По умолчанию, patch обрезает все ведущие имена каталогов, оставляя только имя файла, за исключением случая, когда в файле изменений имя файла задано относительно (первый символ имени - не '/'), и все ведущие каталоги существуют. Тогда patch не обрезает ведущие имена каталогов.

patch ищет каждый файл (после всех обрезанных имен каталогов) от текущего каталога, или если Вы указали опцию '-d DIRECTORY', то от указанного в ней каталога.

Например, допустим в файле изменений указано имя файла '/gnu/src/emacs/etc/NEWS'. Если используется опция -p или -p0, то это имя файла остается неизмененным. -p1 приводит к рассмотрению имени 'gnu/src/emacs/etc/NEWS' (первый символ '/' удаляется). '-p4' приводит к имени 'etc/NEWS'. Если опция -p не указана вообще, то рассматривается файл с именем 'NEWS'.

15.2 Имена резервных файлов.

По умолчанию, 'patch' делает резервную копию изменяемого файла, переименовывая исходный файл добавляя к его имени расширение '.orig', или '~' на системах, которые не поддерживают длинных имен файлов. Опции '-b BACKUP-SUFFIX' или '--suffix=BACKUP-SUFFIX' позволяют использовать BACKUP-SUFFIX как расширение для имени резервного файла.

Вы можете так же указать расширение для резервных файлов с помощью переменной окружения 'SIMPLE_BACKUP_SUFFIX', действие которой тоже перекрывается этими опциями.

'patch' может создавать пронумерованные резервные файлы таким же образом, как это делает GNU Emacs. В этом случае patch будет создавать новый резервный файл каждый раз, когда к исходному файлу применяется patch. Например, если исходный файл называется sink, то резервные копии этого файла будут названы последовательно sink.~1~, sink.~2~, sink.~3~, и т.д.

Аргумент опций '-V BACKUP-STYLE' или '--version-control=BACKUP-STYLE' определяет способ именования резервных копий. Вы можете так же управлять типом создаваемых резервных копий с помощью переменной окружения 'VERSION_CONTROL', действие которой может быть перекрыто при использовании опции '-V'. Значения переменной 'VERSION_CONTROL' и аргумента опции '-V' такие же, как и для переменной version-control в редакторе GNU Emacs. Кроме того, распознаются более понятные синонимы этих значений. Допустимые значения перечислены ниже; можно указывать однозначно определяемые сокращения.

`t' или `numbered'

Всегда делать пронумерованные резервные копии.

`nil' или `existing'

Делать нумерованные резервные копии для файлов, для котороых уже имеются резервные копии и простые копии для остальных. Это значение принимается по умолчанию.

`never' или `simple'

Всегда делать простую резервную копию.

Кроме этого, можно указать patch, чтобы он добавлял префикс (например, имя каталога) к имени файла с резервной копией. Опции '-B BACKUP-PREFIX' или '--prefix=BACKUP-PREFIX' позволяют добавить BACKUP-PREFIX перед именем файла. Если используется эта опция, то patch будет игнорировать заданное Вами значение опции '-b'.

Если резервная копия уже существует, patch создает новую резервную копию, изменяя первую встретившуюся в имени маленькую букву на соответствующую большую букву. Если больших букв нет в имени, то удалятся первый символ из имени. Это повторяется до тех пор, пока не будет получено имя файла, которой еще не существует.

Если Вы указываете имя выходного файла с помощью опции '-o', то создается резервная копия файла, указанного как ее аргумент, а не входного файла.

15.3 Имена файлов отвергнутых изменений

Имена файлов отвергнутых изменений (файлы, содержащие те изменения, которые patch не смог применить, поскольку не нашел соответствующего места) по умолчанию строятся приписыванием суффикса '.rej' (или '#' - для систем, не поддерживающих длинные имена файлов).

Вы можете явно указать patch, что он должен помещать все отвергнутые изменения в один файл. Опция '-r REJECT-FILE' или '--reject-file=REJECT-FILE' позволяет использовать REJECT-FILE как имя для файла отвергнутых изменений.

15.4 Опции patch

В этом разделе приводится полный список опций, которые понимаются программой 'patch'. Старые версии 'patch' не воспринимают опции с длинными именами и опции '-t', '-E' и '-V'.

Несколько однобуквенных опций без аргументов могут быть объединены в один аргумент командной строки (записывается один символ '-', за которым следуют буквы, соответствующие этим опциям). Квадратные скобки ([ и ]) показывают что опция может иметь необязательный аргумент.

`-b BACKUP-SUFFIX'

Использовать BACKUP-SUFFIX как расширение для имен файлов с резервными копиями вместо '.orig' или '~'

`-B BACKUP-PREFIX'

Использовать BACKUP-PREFIX как префикс для имени файла с резервной копией. Если эта опция указано, то опция '-b' игнорируется.

`--batch'

Не задавать никаких вопросов (пакетный режим работы).

`-c' или `--context'

Рассматривать файл изменений как выдачу diff в контекстном формате.

`-d DIRECTORY' или `--directory=DIRECTORY'

Каталог DIRECTORY рассматривается как текущий каталог для интерпретации имен файлов, заданных в пакетном файле и в качестве аргументов для других опций.

`-D NAME'

Выполняет слияние в формате if-then-else. NAME - имя переменной.

`--debug=NUMBER'

Установка внутренних отладочных флагов. Опция представляет интерес только для тех, кто сам патчит (модифицирует) patch.

`-e' или `--ed'

Файл изменений интерпретируется как скрипт для ed.

`-E'

Удалять выходные файлы, которые оказались пустыми в результате применения изменений.

`-f'

Считать, что пользователь уверен в своих действиях, и не задавать никаких вопросов.

`-F LINES'

Установить значение показателя максимальной неточности в LINES.

`--force'

Считать, что пользователь уверен в своих действиях, и не задавать никаких вопросов.

`--forward'

Игнорировать изменения, которые patch считает реверсивными или уже примененными. См. также '-R'

`--fuzz=LINES'

Установить значение показателя максимальной неточности в LINES.

`--help'

Печать справочной информации об опциях, воспринимаемых программой patch.

`--ifdef=NAME'

Выполняет слияние в формате if-then-else. NAME - имя переменной.

`--ignore-white-space' или `-l'

Любая последовательность символов-разделителей в файле изменений считается совпадающей с любой последовательностью символов-разделителей во входном файле.

`-n' или `--normal'

Файл изменений рассматривается как результат работы diff в нормальном формате.

`-N'

Игнорировать изменения, которые patch считает реверсивными или уже примененными. См. также '-R'

`-o OUTPUT-FILE' или `--output=OUTPUT-FILE'

OUTPUT-FILE используется как имя выходного файла.

`-p[NUMBER]'

Устанавливает количество отсекаемых имен каталогов в NUMBER.

`--prefix=BACKUP-PREFIX'

Использовать BACKUP-PREFIX как префикс для имени файла с резервной копией. Если эта опция указано, то опция '-b' игнорируется.

`--quiet'

Работать без выдачи любых сообщений до момента возникновения ошибки.

`-r REJECT-FILE'

Использовать REJECT-FILE как имя файла отвергнутых изменений.

`-R'

Считать, что при создании файла различий имена старого и нового файлов были указаны наоборот (реверсивное изменение).

`--reject-file=REJECT-FILE'

Использовать REJECT-FILE как имя файла отвергнутых изменений.

`--remove-empty-files'

Удалять выходные файлы, которые оказались пустыми в результате применения изменений.

`--reverse'

Считать, что при создании файла различий имена старого и нового файлов были указаны наоборот (реверсивное изменение).

`-s'

Работать без выдачи любых сообщений до момента возникновения ошибки.

`-S'

Пропустить данное изменение из файла изменений, но продолжать обработку со следующего изменения в файле.

`--silent'

Работать без выдачи любых сообщений до момента возникновения ошибки.

`--skip'

Пропустить данное изменение из файла изменений, но продолжать обработку со следующего изменения в файле.

`--strip[=NUMBER]'

Устанавливает количество отсекаемых имен каталогов в NUMBER.

`--suffix=BACKUP-SUFFIX'

Использовать BACKUP-SUFFIX как расширение для имен файлов с резервными копиями вместо '.orig' или '~'

`-t'

Не задавать никаких вопросов.

`-u' или `--unified'

Рассматривать файл изменений как результат работы diff в унифицированном формате.

`-v'

Вывести номер версии patch.

`-V BACKUP-STYLE'

Выбрать способ создания резервных копий изменяемых файлов.

`--version'

Вывести номер версии patch.

`--version=control=BACKUP-STYLE'

Выбрать способ создания резервных копий изменяемых файлов.

`-x NUMBER'

Установка внутренних отладочных флагов. Опция представляет интерес только для тех, кто сам патчит (модифицирует) patch.


Вперед Назад Содержание