Пользователям компьютеров часто требуется узнать, чем отличаются два файла. Может быть, один файл - это обновленная версия другого файла. Или, возможно, два файла, изначально одинаковые, были изменены разными людьми.
Команда 'diff' служит для выяснения разницы между двумя файлами, или всеми соответствующими файлами в двух директориях. 'diff' выдает различия между двумя файлами строка за строкой в любом из нескольких форматов, которые можно установить с помощью опций командной строки. Это множество различий часто называется "diff" или "patch". Для одинаковых файлов 'diff' обычно ничего не выводит; для двоичных (не-текстовых) файлов, 'diff' обычно сообщает только, что они разные.
Команда 'cmp' служит для выяснения смещений и номеров строк, по которым два файла различаются. 'cmp' может также выявить все символы, которыми два файла отличаются друг от друга. Другой способ сравнить два файла посимвольно состоит в использовании команды редактора Emacs 'M-x compare-windows'
Команда 'diff3' служит для выяснения различий между тремя файлами. Когда два человека независимо внесли изменения в один и тот же файл, 'diff3' может сообщить о различиях между оригинальной и двумя измененными версиями, и позволяет создать единый файл, который содержит изменения, сделанные обоими людьми, одновременно с предупреждением о противоречиях между ними.
Команда 'sdiff' служит для интерактивного об'единения двух файлов.
Множество отличий, произведенное программой 'diff' позволяет распространять среди других людей изменения, внесенные в текстовые файлы (такие как исходные тексты программ). Этот метод особенно полезен когда объем изменений незначителен по сравнению с размером полных файлов. Результаты работы 'diff' могут быть использованы программой 'patch' для модифицирования или восстановления копии файла. Если представить 'diff' как вычитание одного файла из другого, для получения их разности, то 'patch' - это сложение разности с первым файлом для воспроизведения второго.
Это руководство сначала описывает как создавать diff-ы (множества отличий), а далее показывает как использовать их для воспроизведения исходных файлов.
GNU 'diff' был написан Майком Хаертелом, Давидом Хайесом, Ричардом Столлманом, Лен Тауер и Полом Эггерт. Вэйн Дэвидсон придумал унифицированный формат вывода. Базовый алгоритм описан в "Нулевой алгоритм поиска отличий и его варианты" Евгением В. Майрес, 'Algorithmica(Алгоритмика)' Ч.1 Nо.2, 1986, с.251-266; и в "Программе сравненения файлов" Веббом Миллером и Евгением В. Майерсом, 'Программное обеспечение - практика и опыт' Ч.15 No.11, 1985, с. 1025-1040. Алгоритм был независимо разработан Е.Укконеном и описан в статье "Алгоритмы для приближенного сравнения строк" в 'Информации и контроле' Ч.64, 1985, с.100-118.
GNU 'diff3' был написан Рэнди Смитом. GNU 'sdiff' был написан Томасом Лорд.
GNU 'cmp' был написан Торбжорном Гранлундом и Дэвидом МакКэнзи.
'patch' был написан в основном Ларри Уоллом; GNU рассширения были написаны в основном Уэйном Дэвидсоном и Дэвидом МакКензи.
Существует несколько представлений о том, как рассматривать различия между двумя файлами. Одно представление, что различия - серии строк, которые были удалены, вставлены или изменены в одном файле для получения другого. 'diff' сравнивает два файла строка за строкой, находя отличающиеся группы строк, и сообщает о каждой такой группе. Он может сообщать об отличающихся строках в нескольких форматах, которые имеют различные назначения.
GNU 'diff' может показать, различаются ли файлы, не уточняя различий. Он также обеспечивает возможности не отображать отдельные виды различий, которые не важны для Вас. В большинстве случаев такие различия - это изменения в количестве "пропусков" между словами или строками. 'diff' также позволяет не отображать различия прописных букв от строчных или различия в строках, которые соответствуют некоторому заданому регулярному выражению. Эти опции могут сочетаться; например, можно игнорировать изменения и в "пропусках", и в замене регистра букв.
Другой способ представлять различия между двумя файлами, рассматривая последовательность пар символов, в которых символы могут совпадать или различаться. 'cmp' сообщает о различиях между двумя файлами символ за символом, а не строка за строкой. Следовательно, он более чем 'diff' подходит для сравнения двоичных файлов. Для текстовых файлов, 'cmp' применяется, главным образом, когда необходимо выяснить являются ли два файла одинаковыми.
Для иллюстрации преимущества построчного сравнения перед посимвольным сравнением, представьте что случиться, если в начало файла добавить единственный символ новой строки. Если сравнить теперь этот файл с первоначальным, в котором нет этой новой строки в начале, 'diff' сообщит, что к файлу добавили пустую строку, в то время как 'cmp' сообщит, что почти все символы в файлах различаются.
'diff3' обычно сравнивает три входных файла строку за строкой, находя группы различающихся строк и сообщает о каждой такой группе. Его результаты работы оформлены так, чтобы легко было отследить два разных набора изменений для одного и того же файла.
Сравнивая два файла, 'diff' находит последовательности строк общих для обоих файлов, разделенных группами разных строк, которые называются ханками. Сравнение двух одинаковых файлов дает одну последовательность общих строк и не дает ханков, так как отличающихся строк нет. Сравнение двух совершенно разных файлов не дает общих строк, а дает один большой ханк, состоящий из всех строк обоих файлов. Вообще говоря, существует много способов искать общие строки для двух данных файлов. 'diff' пытается минимизировать общий размер ханка, ища большие последовательности общих строк разделенных маленькими ханками отличающихся строк.
Например, предположим файл 'F' состоит из трех строк 'a', 'b',' c', а файл 'G' состоит из тех же трех строк в обратном порядке 'c', 'b', 'a'. Если 'diff' посчитает общей строку 'c', команда 'diff F G' выдаст следующий результат:
1,2d0
< a
< b
3a2,3
> b
> a
Но если 'diff' посчитает вместо этого общей строку 'b', результат
будет другим:
1с1
< a
--
> c
3c3
< c
--
> a
Также возможно считать общей строку 'a'. 'diff' не всегда находит оптимальное соответствие между файлами; это позволяет ему работать быстрее. Но его результаты обычно близки к максимально коротким. Вы можете избежать этой издержки с помощью опции '---minimal'
Опции '-b' и '-ignore-space-change' игнорируют "пропуски" на концах строк, и считают все другие последовательности из одного или более "пропусков" одинаковыми. С этими опциями, 'diff' считает следующие две строки одинаковыми ($ обозначает конец строки):
Here lyeth muche rychnesse in lytell space. -- John Heywood$
Here lyeth muche rychnesse in lytell space. -- John Heywood $
Опции '-w' и '-ignore-all-space' более сильные, чем '-b'. Они
игнорируют различия даже если один файл имеет "пропуски" там, где
другой файл их не имеет. "Пропуски" включают в себя табуляцию, символы
новой строки, вертикальную табуляцию, возврат каретки, и пробел;
некоторые системы могут определить дополнительные символы как
"пропуски". C этими опциями, 'diff' считает следующие две строки
одинаковыми ($ обозначает конец строки, а '^M' - возврат коретки):
Here lyeth muche rychnesse in lytell space.-- John Heywood$
He relyeth much erychnes seinly tells pace. --John Heywood ^M$
Опции '-B' и '--ignore-blank-lines' игнорируют вставки или удаления чистых строк. Эти опции предусмотрены только для обработки строк, которые полностью пусты; они не касаются строк которые выглядят как пустые, но содержат пробел или символы табуляции. С этими опциями, например, файл содержащий:
1. A point is that which has no part.
2. A line is breadthless length.
-- Euclid, The Elements, I
считается одинаковым с файлом содержащим:
1. A point is that which has no part.
2. A line is breadthless length.
-- Euclid, The Elements, I
GNU 'diff' может рассматривать прописные буквы как одинаковые с соответствующими им строчными, так, что, например, будет считать `Funky Stuff', `funky STUFF', и `fUNKy stuFf' одинаковыми строками. Чтобы добиться этого, используйте опцию '-i' или '--ignore-case'.
Для игнорирования вставок и удалений строк, соответствующих регулярному выражению используется опция '-l REGEXP' или '--ignore-matching-lines=REGEXP'. Следует избегать регулярных выражений содержащих метасимволы оболочки, чтобы избежать их неправильного толкования оболочкой. Например
diff -I'^[0-9]'
игнорирует все изменения в строках начинающихся с цифры.
Тем не менее, '-I' игнорирует удаление или вставку строк, которые содержат регулярное выражение, только если каждая изменяемая строка в ханках - каждая вставка и удаление - соответствует регулярному выражению. Другими словами, для каждого неигнорируемого изменения, 'diff' печатает полный набор изменений в его окружении, включая игнорируемые.
Можно определить более одного выражения для игнорирования строк, используя более одной опции '-I'. 'diff' пытается учитывать во всех строках все выражения, начиная с последнего заданного.
Когда необходимо выяснить только отличаются ли файлы, и не важно чем именно, можно использовать обобщенный формат вывода. В этом формате, не показывая различия между файлами, 'diff' просто сообщает отличаются ли они. Этот формат задается опциями '-q' и '--brief'.
Особенно полезен обобщенный формат для сравнения содержания двух директорий. Он также гораздо быстрее, чем обычное сравнивание строка за строкой, так как 'diff' может остановить анализ файлов как только обнаружит, что они отличаются.
Чтобы быстро показать отличаются ли файлы друг от друга, можно также использовать 'cmp'. Для одинаковых файлов, 'cmp' не производит никакого вывода. Для разных файлов 'cmp', по умолчанию выводит смещение и номер строки там, где было обнаружено первое различие. Используя опцию '-s', можно игнорировать эту информацию, так что 'cmp' не будет создавать выходного файла и сообщит лишь отличаются ли они используя выходной статус (см. "Запуск cmp").
В отличие от 'diff', 'cmp' не может сравнивать каталоги; он сравнивает только файлы.
Если 'diff' считает, что оба файла, которые он сравнивает двоичные (нетекстовые), он обычно рассматривает эту пару файлов так, как если бы был выбран обобщенный формат вывода, и сообщает только, отличаются ли эти файлы. Так делается потому, что сравнение строка за строкой обычно бессмысленно для двоичных файлов.
'diff' определяет является ли файл текстовым или двоичным проверяя в нем первые несколько байтов; точное число проверяемых байтов зависит от системы, но обычно это несколько тысяч. Если каждый символ в этой части файла ненулевой, 'diff' считает файл текстовым; иначе файл считается двоичным.
Иногда может быть необходимо заставить 'diff' рассматривать файлы как текстовые. Например, сравниваются текстовые файлы, содержащие нулевые символы; 'diff' ошибочно решит, что эти файлы нетекстовые. Или сравниваются документы в формате, используемом текстовым редактором, который содержит нулевые символы для описания особого форматирования. Можно заставить 'diff' рассматривать все файлы как текстовые, и сравнивать их строка за строкой, с помощью опции '-a' или '--text'. Если файлы, сравниваемые при помощи этой опции, на самом деле не содержат текст, они возможно содержат несколько символов новой строки, и результаты работы 'diff' будут содержать ханки показывающие различия между длинными строками тех символов, какие бы они ни были, из которых состоят файлы.
Можно также заставить 'diff' рассматривать все файлы как двоичные, сообщая только отличаются ли они (но не сообщая чем). Для этого используется опция '--brief'.
В операционных системах, различающих текстовые и двоичные файлы, 'diff' обычно считывает и записывает все данные как текст. Использование опции '--binary' заставляет 'diff' считывать и записывать вместо этого двоичные данные. Эта опция не действует на Posix-совместимых системах таких как GNU или традиционный Unix. Тем не менее, многие операционные системы на персональных компьютерах отображают конец строки возвратом каретки и следующим за ним символом новой строки. На таких системах, 'diff' обычно игнорирует эти возвраты каретки при вводе и генерирует их в конце каждой обработанной строки, но с опцией '--binary' 'diff' воспринимает возрат каретки просто как еще один обрабатываемый символ, и не генерирует его в конце каждой обработанной строки. Это может быть полезно для работы с нетекстовыми файлами, которые должны быть совместимы с Posix системами.
Если необходимо сравнивать два файла байт за байтом, можно использовать программу 'cmp' с опцией '-l', чтобы выяснить значения каждого отличающегося байта в файлах. В GNU 'cmp', используя опцию '-c', можно показывать ASCII представление этих байтов. (см. подробнее "Запуск cmp").
Если 'diff3' считает, что все сравниваемые файлы - двоичные (нетекстовые файлы), он обычно сообщает об ошибке, так как такие сравнения обычно бесполезны. 'diff3' использует тот же метод, что и 'diff' чтобы определить является ли файл двоичным. Как и в 'diff', если входные файлы состоят их нескольких нетекстовых символов, но с другой стороны скорее являются текстовыми, можно заставить 'diff3' рассматривать все файлы как текстовые и сравнивать их строка за строкой с помощью опции '-a' или '--text'.
У 'diff' есть несколько взаимоисключающих опций для задания формата вывода. Следующие разделы посвящены описанию каждого формата, показывая как 'diff' сообщает о различиях на примере двух образцов входных файлов.
Далее представлены два образца входных файлов, которые мы будем использовать в нескольких примерах, чтобы показать работу 'diff' и как различные опции ее меняют.
Это файл 'lao':
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
The Named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their outcome.
The two are the same,
But after they are produced,
they have different names.
Это файл `tzu':
The Nameless is the origin of Heaven and Earth;
The named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their outcome.
The two are the same,
But after they are produced,
they have different names.
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
В этом небольшом примере легко найти различающиеся строки и
понять, что для этого примера, первый ханк содержит только первые две
строки 'lao', второй ханк содержит четыре строки 'lao',
соответствующие второй и третьей строке 'tzu', а последний - три
конечные строки 'tzu'.
"Нормальный" формат вывода 'diff' показывает каждый ханк различий без какого-либо окружающего контекста. Иногда такой вывод - наиболее ясный способ понять, как изменились строки, не отвлекаясь на соседние неизменившиеся (хотя можно получить такой же результат с контекстным или унифицированным форматом с 0 строками контекста). Тем не менее, этот формат теперь редко используется для пересылки изменений; для этой цели предпочтительнее контекстный (см. "Контекстный формат") и унифицированный (см. "Унифицированный формат") форматы. Нормальный формат принят для совместимости с более ранними версиями 'diff' и стандартом Posix.
Нормальный формат вывода состоит из одного или более ханков различий; каждый ханк показывает на место где файлы различаются. Нормальный формат ханка выглядит так:
CHANGE-COMMAND
< FROM-FILE-LINE
< FROM-FILE-LINE...
--
> TO-FILE-LINE
> TO-FILE-LINE...
Есть три типа меняющих команд. Каждая состоит из номера строки
или разделенной запятыми цепочки номеров в первом файле, одного
символа, показывающего какой вид изменения нужно сделать и номера
строки или разделенной запятыми цепочки номеров во втором файле. Все
номера строк - оригинальные номера строк для каждого файла. Типы
меняющих команд следующие:
Прибавляет строки из промежутка R во втором файле после строки L в первом файле. Например, '8a12,15' означает дописать строки 12-15 второго файла после 8 строки первого файла; или, если изменять второй файл в первый, удалить строки 12-15 из второго файла.
Заменяет строки из промежутка F первого файла строками из промежутка T второго файла. Эту команду можно представить как комбинацию добавления и удаления, но более компактную. Например, '5,7c8,10' означает заменить строки 5-7 первого файла на строки 8-10 второго файла; или, если изменять второй в первый, заменить строки 8-10 второго файла на строки 5-7 первого файла.
Удаляет строки из промежутка R первого файла; строка L - это место, где находились бы эти строки во втором файле, если бы их не удалили. Например, '5,7d3' означает удалить строки 5-7 из первого файла; или, если изменять второй файл в первый, добавить строки 5-7 первого файла после 3 строки второго файла.
Далее представлен результат работы команды 'diff lao tzu' (см. "Два образца входных файлов", для полного текста этих файлов). Заметьте, что отображаются только те строки, которые в этих файлах разные.
1,2d0
< The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
4c2,3
< The Named is the mother of all things.
--
> The named is the mother of all things.
>
11a11,13
> They both may be called deep and profound.
> Deeper and more profound,
> The door of all subtleties!
Обычно, рассматривая различия между двумя файлами, необходимо также видеть части файлов около отличающихся строк, чтобы легче понять что действительно изменилось. Эти соседние части файлов называются "контекстом".
GNU 'diff' обеспечивает два формата вывода, которые показывают контекст около различающихся строк: "контекстный формат" и "унифицированный формат". Он может оптимальным образом показывать в какой функции или разделе файла были найдены различающиеся строки.
При распространении новых версий файлов среди других людей в форме результатов работы 'diff', следует использовать один из форматов вывода, показывающих контекст изменений, так чтобы они могли применять "изменения" даже если они вносили свои собственные маленькие изменения в файлы. 'patch' может применять "изменения" в этом случае, ища в файлах отличающиеся строки по контексту; если эти строки на самом деле незначительно смещены от указанного в "изменениях" положения, 'patch' может привести номера строк в соответсвие со смещением и все равно применить "изменения" правильно. (См. "Применение несовершенных списков различий", для подробностей использования 'patch' в применении к несовершенным "изменениям").
Контекстный формат вывода отображает несколько строк из контекста отличающихся строк. Это стандартный формат для распространения улучшенных исходных текстов.
Чтобы работать в этом формате вывода, используйте опции '-C LINES', '--context[=LINES]', или '-c'. Аргумент LINES, который используется в первых двух опциях, - это количество показываемых строк контекста. Если не указывать аргумент LINES, он принимается равным 3. Для правильной работы 'patch' требуется по крайней мере 2 линии контекста.
Контекстный формат вывода начинается с двухстрочного заголовка, который выглядит так:
*** FROM-FILE FROM-FILE-MODIFICATION-TIME
--- TO-FILE TO-FILE-MODIFICATION TIME
Вы можете изменить содержание заголовока с помощью опции '-L
LABEL' или '--label=LABEL'; (см. "Альтернативные имена".)
Потом следует один или несколько ханков различий; каждый ханк показывает одно место, где файлы различаются. Контекстный формат ханка выглядит так:
***************
*** FROM-FILE-LINE-RANGE ****
FROM-FILE-LINE
FROM-FILE-LINE...
--- TO-FILE-LINE-RANGE ---
TO-FILE-LINE
TO-FILE-LINE...
Строки контекста окружающего отличающиеся строки начинаются двумя
символами пробела. Строки разные для двух файлов начинаются с одного
из следующих символов:
Строка, являющаяся частью группы из одной или нескольких строк, которые изменились от одного файла к другому. Существует соответствующая группа строк отмеченная '!' в этом же ханке, относящаяся к другому файлу.
Строка "вставленная" во второй файл, которой нет соответствия в первом файле.
Cтрока "удаленная" из первого файла, которой нет соответствия во втором файле.
Далее представлен результат работы команды 'diff -c lao tzu' (см. Два образца входных файлов:: , для полного текста этих файлов). Заметьте, что около каждой отличающейся строки отображается до трех совпадающих; это строки контекста. Также обратите внимание, что первые два ханка идут слитно, так как их контексты перекрываются.
*** lao Sat Jan 26 23:30:39 1991
--- tzu Sat Jan 26 23:30:50 1991
****************
*** 1,7 ****
- The Way that can be told of is not the eternal Way;
- The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
! The Named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
--- 1,6 ----
The Nameless is the origin of Heaven and Earth;
! The named is the mother of all things.
!
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
***************
*** 9,11 ****
--- 8,13 ----
The two are the same,
But after they are produced,
they have different names.
+ They both may be called deep and profound.
+ Deeper and more profound,
+ The door of all subtleties!
Далее представлен результат работы команды 'diff --context=1 lao tzu' (см. "Два образца входных файлов" для полного текста этих файлов). Заметьте, что здесь отображается не больше одной строки контекста.
*** lao Sat Jan 26 23:30:39 1991
--- tzu Sat Jan 26 23:30:50 1991
****************
*** 1,5 ****
- The Way that can be told of is not the eternal Way;
- The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
! The Named is the mother of all things.
Therefore let there always be non-being,
--- 1,4 ----
The Nameless is the origin of Heaven and Earth;
! The named is the mother of all things.
!
Therefore let there always be non-being,
***************
*** 11 ****
--- 10,13 ----
they have different names.
+ They both may be called deep and profound.
+ Deeper and more profound,
+ The door of all subtleties!
Унифицированный формат вывода - это вариант контекстного формата, который более компактен, так как не включает избыточные строки контекста. Чтобы задать этот формат вывода, используйте опции '-U LINES', '--unified[=LINES]' или '-u'. Аргумент LINES показывает сколько строк контекста показывать. По умолчанию он равен 3.
На данный момент, только GNU 'diff' может работать с этим форматом и только GNU 'patch' может автоматически применять "изменения" в этом формате. Для правильной работы, 'patch' необходимо по крайней мере 2 строки контекста.
Унифицированный формат вывода начинается с двухстрочного заголовка, который выглядит так:
--- FROM-FILE FROM-FILE-MODIFICATION-TIME
+++ TO-FILE TO-FILE-MODIFICATION-TIME
Вы можете изменить содержание заголовка с помощью опции '-L
LABEL' или `--label=LABEL'; (см. "Альтернативные названия".)
Потом следует один или несколько ханков различий; каждый ханк показывает одно место, где файлы различаются. Унифицированный формат ханка выглядит так:
@@ FROM-FILE-RANGE TO-FILE-RANGE @@
LINE-FROM-EITHER-FILE
LINE-FROM-EITHER-FILE...
Строки общие для обоих файлов начинаются с символа пробела.
Различающиеся строки имеют один из следующих символов-индикаторов в
левой колонке:
В этом месте строка была прибавлена к первому файлу.
В этом месте строка была удалена из первого файла.
Далее представлен результат работы команды 'diff -u lao tzu' (см. Два образца входных файлов:: , для полного текста этих файлов).
--- lao Sat Jan 26 23:30:39 1991
+++ tzu Sat Jan 26 23:30:50 1991
@@ -1,7 +1,6 @@
-The Way that can be told of is not the eternal Way;
-The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
-The Named is the mother of all things.
+The named is the mother of all things.
+
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
@@ -9,3 +8,6 @@
The two are the same,
But after they are produced,
they have different names.
+They both may be called deep and profound.
+Deeper and more profound,
+The door of all subtleties!
Иногда бывает необходимо знать на какой раздел файлов приходится каждое изменение. Если файлы - это тексты программ, это может касаться изменений функций. Если файлы - документы, это могут быть изменения глав или приложений. GNU 'diff' может сообщать об этом, показывая ближайший заголовок раздела, который предшествует изменяемым строкам. Какие строки считать "заголовками разделов" определяется с помощью регулярного выражения.
Чтобы показать в каких разделах встретились изменения в файлах не являющихся текстами программ для C или сходного языка, используйте опцию '-F REGEXP' или `--show-function-line=REGEXP'. 'diff' рассматривает строки, которые соответствуют агрументу REGEXP как начала разделов файла. Далее приведены регулярные выражения, заданные для нескольких распространенных языков:
C, C++, Prolog
Lisp
Texinfo
Опции `-F' и `--show-function-line' находят для каждого ханка различий ближайшую предшествующую ему неизмененную строку, соответствующую данному регулярному выражению. Затем они добавляют эту строку в конец строки звездочек в контекстном формате, или в конце '@@'-строки в унифицированном формате. Если такой строки не найдено, они оставляют ханк неизменненым. Если эта строка состоит более чем из 40 символов, они учитывают только первые 40 символов. Можно указать более одного регулярного выражения для таких строк; 'diff' ищет соответствия для всех строк со всеми регулярными выражениями, начиная с последнего заданного. Это означает, что при желании допустимо использовать опции '-p' и '-F' совместно.
Чтобы отображать в каких функциях обнаружены различия для C или сходного языка, можно использовать опцию `-p' или `--show-c-function'. Эта опция автоматически устанавливает контекстный формат вывода (см. Контекстный формат::.), с заданным по умолчанию количеством строк контекста. Возможно изменение этого числа введением '-C LINES' в командной строке. Можно изменить и формат и число строк контекста с помощью '-U LINES'.
Опции `-p' и `--show-c-function' эквиваленты `-F'^[_a-zA-Z$]'', если указан унифицированный формат, или `-c -F'^[_a-zA-Z$]'' в противном случае (см. Определение заголовков::.). В GNU 'diff' они введены в качестве сокращений.
Если сравниваются два файла, имеющие бессмысленные или неинформативные имена, возможно заставить 'diff' показывать альтернативные имена в заголовке контекстного или унифицированного форматов вывода с помощью опции '-L LABEL' или '--label=LABEL'. Первое применение этой опции заменяет на свой аргумент имя и дату первого файла в заголовке; второе применение заменяет на аргумент имя и дату второго файла. Если попытаться использовать эту опцию еще раз, 'diff' сообщит об ошибке. Опция '-L' не затрагивает имена файлов в заголовке 'pr', когда использована опция '-l' или '--paginate' (см. "Разбивка результатов 'diff' на страницы").
Далее приведены первые две строки результатов работы `diff -C2 -Loriginal -Lmodified lao tzu':
*** original
--- modified
'diff' позволяет двусторонне отображать различия между двумя файлами. Файлы отображаются в двух колонках разделенных колонкой управляющих символов. Колонка управляющих символов состоит из следующих маркеров:
Соответствующие строки эквивалентны. Это означает, что либо они одинаковые, или различие игнорировано из-за одной из опций '--ignore' (см. "Пропуски".).
Соответствующие строки разные, и либо обе приведены полностью, либо обе неполностью.
'<' Строка содержится только в первом файле.
Строка содержится только во втором файле.
Строка содержится только в первом файле, но различие игнорируется.
Строка содержится только во первом файле, но различие игнорируется.
Соответствующие строки разные, первая строка приведена неполностью.
' /
Соответствующие строки разные, вторая строка приведена неполностью.
Двусторонний формат обычно проще воспринимается, но он имеет свои ограничения. Он генерирует более широкие строки, обрезая непомещающиеся строки. Кроме того, для него более, чем для остальных форматов важна выравненность текста, так что его результаты выглядят особенно плохо при использовании шрифтов разной ширины, нестандартной табуляции, или непечатающихся символов.
Для интерактивного устранения различий при двустороннем формате можно использовать команду 'sdiff'. (См. подробнее "Интерактивное устранение различий").
Двусторонний формат задается опцией '-y' или '--side-by-side'. Поскольку строки двустороннего формата содержат две исходные строки, они шире, чем обычно. В норме они состоят из 130 символов, так, что могут поместиться в традиционную строку принтера. Их длину можно устанавливать с помощью опции '-W COLUMNS' или '--width=COLUMNS'. Результирующая строка разбивается на две половины равной длины, разделенные маленькой колонкой управляющих символов для отметки различий; правая половина выравнена на границу табуляции. Входные строки, которые не помещаются в половинках выходной строки, обрезаются.
Опция '--left-column' печатает только левую колонку для двух общих строк. Опция '--supress-common-lines' не печатает их вообще.
Далее представлен результат работы команды 'diff -y -W 72 lao tzu' (см. Два образца входных файлов:: , для полного текста этих файлов).
The Way that can be told of is n <
The name that can be named is no <
The Nameless is the origin of He The Nameless is the origin of He
The Named is the mother of all t | The named is the mother of all t
>
Therefore let there always be no Therefore let there always be no
so we may see their subtlety, so we may see their subtlety,
And let there always be being, And let there always be being,
so we may see their outcome. so we may see their outcome.
The two are the same, The two are the same,
But after they are produced, But after they are produced,
they have different names. they have different names.
> They both may be called deep and
> Deeper and more profound,
> The door of all subtleties!
Несколько режимов вывода создают управляющие файлы для редактирования FROM-FILE с целью получения TO-FILE.
'diff' позволяет составлять командный файл, показывающий текстовому редактору 'ed' как изменить первый файл во второй. Раньше это был единственный формат вывода, позволяющий делать из одного файла другой автоматически; сегодня, благодаря утилите 'patch', он практичеки устарел. Чтобы задать этот формат используйте опцию '-e' или '--ed'.
Как и в нормальном формате (см. "Нормальный формат".), этот формат вывода не показывает контекста; но в отличие от нормального формата, он не включает информацию, необходимую для обращения "изменений" (воссоздания первого файла, при наличии второго и "изменений").
Если файл 'd' содержит результаты работы команды 'diff -e old new', то команда '(cat d && echo w) | ed -old' редактирует файл 'old' для создания копии 'new'. Более общий пример: если 'd1', 'd2', ..., 'dN' содержат результаты работы комманд 'diff -e old new1', 'diff -e new1 new2', ..., 'diff -e newN-1 newN' соответственно, то команда '(cat d1 d2 ... dN && echo w) | ed -old' редактирует файл для создания копии 'newN'.
'Ed'-формат вывода состоит из одного или более ханков различий. Изменения ближайшие к концу файлов идут первыми, так чтобы команды меняющие номера строк не влияли на интерпретацию 'ed' номеров строк в последующих командах. Ханки в 'ed'-формате выглядят так:
CHANGE-COMMAND
TO-FILE-LINE
TO-FILE-LINE...
.
Поскольку 'ed' использует одиночную точку в строке текста как
признак окончания ввода, GNU 'diff' защищает строки изменений, которые
содержат одиночную точку в строке, заменяя их на строки с двумя
точками, и выводя команду для замены двух точек на одну. Формат 'ed'
не может представить незавершенную строку, так что если второй файл
кончается незавершенной строкой, 'diff' выдает сообщение об ошибке,
после чего позволяет себе добавление символа новой строки.
Существует три типа команд, изменяющих текст. Каждая состоит из номера строки или раздленного запятыми списка строк первого файла и символа, показывающего какой вид изменения нужно сделать. Все номера строк оригинальны для каждого файла. Типы команд следующие:
Добавить текст из второго файла после строки L первого файла. Например, '8a' значит добавить следующие строки после строки 8 первого файла.
Заменить строки из промежутка R в первом файле следующими строками. Команда подобна комбинации удаления и вставки, но более компактна. Например, '5,7c' значит заменить строки 5-7 первого файла на текст из второго файла.
Удалить строки из промежутка R в первом файле. Например, '5,7d' значит удалить строки 5-7 из первого файла.
Далее представлен результат работы команды 'diff -e lao tzu' (см. "Два образца входных файлов", для полного текста этих файлов):
11a
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
.
4c
The named is the mother of all things.
.
1,2d
'diff' позволяет выводить результаты работы в формате командного файла для 'ed', но с прямым (от первого к последнему) порядком ханков. Формат команд также немного изменен: командные символы предшествуют списку изменяемых строк, строки в списке разделяются пробелами, и не делается попыток прояснить строки ханков, состосящие из одного периода. Подобно 'ed'-формату, прямой 'ed'-формат не может отображать неполные строки.
Прямой 'ed'-формат не очень полезен, так как ни 'ed', ни 'patch' не могут применять "изменения" этого формата. Он существует главным образом для совместимости с более старыми версиями 'diff'. Чтобы задать его используйте опцию '-f' или '--forward-ed'.
Формат вывода RCS разработан специально для использования Системой управления изменениями (Revision Control System - RCS), представляющей из себя набор свободно распространяемых программ, используемых для организации хранения разных версий и систем файлов. Используйте опцию '-n' или '--rcs' для задания этого формата вывода. Он похож на прямой 'ed'-формат (см. "Прямые командные файлы для ed".), но позволяет отображать произвольные изменения в контексте файлов, потому что избегает проблем прямого 'ed'-формата со строками, состоящими из одной точки и неполными строками. Вместо того, чтобы кончать разделы текста строками, состоящими из одного периода, каждая команда указывает на номер строки с которой имеет дело; вместо команды 'c' используется комбинация из команд 'a' и 'd'. Кроме того, если второй файл кончается измененной неполной строкой, то выходной файл также заканчивается неполной строкой.
Далее представлен результат работы команды 'diff -n lao tzu' (см. "Два образца входных файлов" , для полного текста этих файлов):
d1 2
d4 1
a4 2
The named is the mother of all things.
a11 3
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
Возможно использование 'diff' для слияния двух файлов - текстов программ на С. Результат работы 'diff' в этом формате будет содержать все строки обоих файлов. Строки общие для файлов отображаются только один раз; разные части разделяются с помощью директив препроцессора C '#ifdef NAME' или '#ifndef NAME', '#else', и '#endif'. При компиляции, таким образом, можно выбирать какую версию использовать определяя или оставляя неопределенным макрос NAME.
Для слияния двух файлов, используйте 'diff' с опцией '-D NAME' или '--ifdef=NAME'. Аргумент NAME - это идентификатор, который будет использовать препроцессор C в директивах '#ifdef' и '#ifndef'.
Например, при изменении первоначального
'wait (&s)'
на
'waitpid (-1,&s,0)'
и слиянии старого и нового файлов с помощью опции
'--ifdef=HAVE_WAITPID', конечная часть вашего текста может выглядить
так:
do {
#ifndef HAVE_WAITPID
if ((w = wait (&s)) < 0 && errno != EINTR)
#else /* HAVE_WAITPID */
if ((w = waitpid (-1, &s, 0)) < 0 && errno != EINTR)
#endif /* HAVE_WAITPID */
return w;
} while (w != child);
Можно определить формат для языка отличного от C используя
форматы групп строк и строчные форматы, как будет описаны далее.
Форматы групп строк позволяют Вам задать форматы, работающие для многих приложений, которые позволяют ввод структурами if-then-else, включая языки программирования и форматирования текста. Формат групп строк задает формат вывода для соприкасающихся групп сходных строк.
Например, следующая команда сравнивает TeX файлы 'old' и 'new' и выводит единый файл, в котором старые районы окружены строками '\begin{em}'-'\end{em}', а новые районы - строками '\begin{bf}'-'\end{bf}':
diff \
--old-group-format='\begin{em}
%<\end{em}
' \
--new-group-format='\begin{bf}
%>\end{bf}
' \
old new
Следующая команда эквивалентна предыдущему примеру, но немного
более многословна, потому что она раскрывает заданные по умолчанию
форматы групп строк.
diff \
--old-group-format='\begin{em}
%<\end{em}
' \
--new-group-format='\begin{bf}
%>\end{bf}
' \
--unchanged-group-format='%=' \
--changed-group-format='\begin{em}
%<\end{em}
\begin{bf}
%>\end{bf}
' \
old new
Далее представлен более сложный пример, который выдает список
различий с заголовками, содержащими номера строк в стиле "прямой
английский".
diff \
--unchanged-group-format='' \
--old-group-format='-------- %dn line%(n=1?:s) deleted at %df:
%<' \
--new-group-format='-------- %dN line%(N=1?:s) added after %de:
%>' \
--changed-group-format='-------- %dn line%(n=1?:s) changed at %df:
%<-------- to:
%>' \
old new
Чтобы задать формат групп строк, используйте 'diff' с одной из
показанных ниже опций. Вы можете задать до 4 форматов групп строк, по
одной для каждого вида группы. Следует заключать FORMAT в кавычки, так
как он обычно содержит метасимволы оболочки.
Эти группы строк являются ханками, содержащими только строки из первого файла. Заданный по умолчанию формат старых групп - то же самое, что формат измененных групп, если он задан; иначе это формат, выдающий группы строк как они есть.
Эти группы строк являются ханками, содержащими только строки второго файла. Заданный по умолчанию формат новых групп - то же самое, что формат изменненых групп, если он задан; в противном случае, это формат, выдающий группы строк, как они есть.
Эти группы строк являются ханками, содержащими строки из обоих файлов. Заданный по умолчанию формат измененных групп - это комбинация из форматов старых и новых групп.
Эти группы строк содержат строки, общие для обоих файлов. Заданный по умолчанию формат неизмененных групп - это формат, выдающий группы строк, как они есть.
обозначает строки первого файла, включая символ новой строки. Каждая строка форматирована в соответствии с форматом старых строк (см. Строчные формат::.).
обозначает строки второго файла, включая символы новой строки. Каждая строка форматирована в соответствии с форматом новых строк.
обозначает строки, общие для обоих файлов, включая завершающие символы перехода на новую строку. Каждая строка форматируется в соответствии с форматом неизмененных строк
обозначает '%'.
где С - некоторый символ; обозначает этот символ. C не может быть символом обратная косая черта '/' или апострофом. Например, '%c':'' обозначает двоеточие, даже внутри then-части формата if-then-else, которая обычно завершается двоеточием.
где O - строка из 1, 2 или 3 восьмеричных цифр; обозначает символ, десятичный код которого O. Например, '%c'\0'' обозначает символ с кодом ноль.
где F - строка форматирования в стиле функции языка Си 'printf', а N - один из следующих символов, обозначающее значение, которое должно быть отформатировано в соответствии с F
Номер строки, предшествующей группе в старом файле.
Номер первой строки в группе из старого файла; равен E + 1.
Номер последней строки в группе из старого файла.
Номер строки, следующей за группой в старом файле; равен L + 1.
Количество строк в группе из старого файла; равно L - F + 1.
То же для строк в новом файле.
Если A равно B, то T, иначе E. A и B оба должны быть либо десятичными константами, либо единственным символом, интерпретируемым подобно вышеописанному. Этот вид формата эквивалентен T, если значение A равно значению B; в противном случае он эквивалентен E.
Например, '%(N=0?no:%dN) line%(N=1?:s)' эквивалентно 'no lines', если N (количество строк в группе из нового файла) равно 0, '1 line', если N равно 1, и '%dN lines' в противном случае.
Строчные форматы управляют, каким образом каждая строка, взятая из входного файла, выводится как часть группы строк в формате if-then-else.
Например, следующая команда выводит текст с одной колонкой индикатора изменений слева от текста. Первая колонка выводит '-' для удаленных строк, '|' - для добавленных строк, и пробел - для неизмененных строк. Форматы содержат символы новых строк, там, где допустим их вывод.
diff \
--old-line-format='-%l
' \
--new-line-format='|%l
' \
--unchanged-line-format=' %l
' \
old new
Чтобы задать строчный формат, используйте одну из следующих
опций. Следует заключать FORMAT в кавычки, поскольку он часто содержит
метасимволы оболочки.
форматирует только строки из первого файла.
форматирует только строки из второго файла.
форматирует строки, общие для обоих файлов.
форматирует все строки; т.е. имеет тот же эффект, что и одновременное применение трех предыдущих опций.
В строчном формате обычные символы представляют сами себя; спецификации изменений начинаются с символа '%' и имеют одну из следующих форм.
обозначает содержимое строки, не включая прилегающих к ней символов перехода на новую строку (если они есть). Для этого формата все равно, является ли строка неполной (см. "Неполные строки").
обозначает содержмое строки, включая прилегающие к ней символов перехода на новую строку (если они есть). Если строка неполна, этот формат сохраняет ее такой, как она есть.
обозначает '%'.
где С - некоторый символ. С не может быть символом "обратная косая черта" или апострофом. Например, '%c':'' обозначает двоеточие.
где O - строка из 1, 2 или 3 восьмеричных цифр, обозначает символ, десятичный код которого O. Например, '%c'\0'' обозначает символ с кодом ноль.
где F - строка форматирования в стиле функции языка Си 'printf'; обозначает строки с номером n, форматированные с помощью F. Например, '%.5dn' печатает строку с номером n, пользуясь форматом '"%.5d"'. (См. подробнее "Форматы групп строк").
Заданный по умолчанию формат строк - '%l' с символом новой строки на конце.
Если входной текст содержит символы табуляции, и необходимо, чтобы это сохранилось в результирующем тексте, следует следить за тем, чтобы '%l' и '%L' в строчном формате следовали только после табуляции (например, ставить символ табуляции перед каждым '%l' или '%L'), или использовать опции '-t' или '--expand-tabs'.
Определенные одновременно, строчный формат и формат групп строк позволяют задать много разных форматов. Например, следующая команда использует формат, похожий на нормальный формат 'diff'. С помощью изменений этой команды можно получить полный контроль над выводом информации 'diff'.
diff \
--old-line-format='< %l
' \
--new-line-format='> %l
' \
--old-group-format='%df%(f=l?:,%dl)d%dE
%<' \
--new-group-format='%dea%dF%(F=L?:,%dL)
%>' \
--changed-group-format='%df%(f=l?:,%dl)c%dF%(F=L?:,%dL)
%<--
%>' \
--unchanged-group-format='' \
old new
Для строк общих для обоих файлов, 'diff' использует формат неизмененных групп строк. Для каждого ханка различий в объединяющем формате вывода, если ханк содержит только строки из первого файла, 'diff' использует формат старых групп строк; если ханк содержит только строки из второго файла, 'diff' использует формат новых групп; иначе, 'diff' использует формат измененных групп.
Формат старых, новых и неизмененных строк задает формат вывода из строк первого файла, строк второго файла и строк общих для обоих файлов соответственно.
Опция '--ifdef=NAME' эквивалента следующей последовательности опций, использующих синтаксис оболочки:
--old-group-format='#ifndef NAME
%<#endif /* not NAME */
' \
--new-group-format='#ifdef NAME
%>#endif /* NAME */
' \
--unchanged-group-format='%=' \
--changed-group-format='#ifndef NAME
%<#else /* NAME */
%>#endif /* NAME */
'
Следует внимательно следить за правильностью вложенности в
выходном Например, при использовании опций '-D NAME' или
'--ifdef=NAME', необходимо следить, чтобы различающиеся строки,
содержащие любые из директив препроцессора C: '#ifdef', '#ifndef',
'#else', '#elif', или '#endif' размещались в нужных местах и попарно
соответствовали по вложенности. Если это не так, нужно внести
изменения вручную. Лучше всего отслеживать результирующйи код всегда,
чтобы быть уверенным, что вы получили то, что ожидали; в зависимости
от того, как были получены входные файлы, выходной файл может
содержать повторяющиеся строки или другие ошибки в коде.
Опция 'patch' '-D NAME' работает также как и опция 'diff' '-D NAME', за исключением того, что она имеет дело с файлом и diff-ом для воспроизведения единого файла (см. Опции patch::).
Далее представлен результат работы 'diff -DTWO lao tzu' (см. Два образца входных файлов::, для полного текста этих двух файлов):
#ifndef TWO
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
#endif /* not TWO */
The Nameless is the origin of Heaven and Earth;
#ifndef TWO
The Named is the mother of all things.
#else /* TWO */
The named is the mother of all things.
#endif /* TWO */
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their outcome.
The two are the same,
But after they are produced,
they have different names.
#ifdef TWO
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
#endif /* TWO */
Возможно использование 'diff' для сравнения некоторых или всех файлов в двух каталогах. Когда оба аргумента-имена файлов для 'diff' каталоги, он сравнивает каждый файл, содержащийся в обоих каталогах, в алфавитном порядке имен файлов. Обычно 'diff' не упоминает о парах неотличающихся файлов, но с опцией '-s' или '--report-identical-files', он будет сообщать и о таких парах. Обычно 'diff' сообщает о подкаталогах, общих для обоих каталогов, не сравнивая файлы в них, но с помощью опции '-r' или '--recursive', он бужет сравнивать соответствующие файлы в дереве каталогов, опускаясь до самых глубоких каталогов.
Для имен файлов, содержащихся только в одном каталоге, 'diff' обычно не показывает текста этих файлов, сообщая только, что файлы находятся в одном каталоге и отсутствуют в другом. Можно заставить 'diff' поступать так, как если бы соответствующие файлы существовали и в другом каталоге, но являлись пустыми, тогда в результатах будет присутствовать полный текст таких файлов. (Такие отличия будут рассматриваться как вставки или удаления, в зависимости от того существует файл в первой или второй директории.) Чтобы добиться этого используйте опцию '-N' или '--new-file'.
Если в более старом каталоге содержится один или более больших файлов, не содержащихся в более новом, можно уменьшить patch с помощью опции '-P' или '--unidirectional-new-file' вместо '-N'. Эта опция подобна '-N', за исключением того, что она вставляет только содержимое файлов, появившихся во втором каталоге, а не в первом (т.е. добавленных файлов). В начале patch пишется инструкция для пользователей, применяющих patch, - стереть удаленные файлы, перед применением (см. подробнее о составлении patch-ей: "Составление patch-ей").
Для игнорирования некоторых файлов при сравнении каталогов, используйте опцию '-x PATTERN' или '--exclude=PATTERN'. Эта опция игнорирует все файлы или поддиректории, чьи базовые имена соответствуют шаблону оболочки PATTERN. В отличие от оболочки, точка в начале имени файла рассматривается так же, как символ *. Следует заключать PATTERN в апострофы, чтобы оболочка не истоловала их неправильно. Например, опция '-x '*.[ao]'' игнорирует все файлы, имена которых заканчиваются на '.a' или '.o'.
Информация, указанная в этой опции, сохраняется, если ее использовать несколько раз. Например, использование опций '-x 'RCS' -x '*,v'' задает игнорирование всех файлов и подкаталогов, имеющих имя 'RCS' или заканчивающихся на ',v'.
Если необходимо использовать эту опцию по несколько раз, можно вместо этого поместить шаблоны в файл, по одному на строку и использовать опцию '-X FILE' или '--exclude-from=FILE'.
Если два каталога находились в процессе сравнения и этот процесс был прерван, позже возможно вернуться к сравнению и продолжить его с того же места с помощью опции '-S FILE' или '--starting-file=FILE'. После этого сравниваться будут только файл и FILE и следующеи за ним в алфавитном порядке, в верхнем уровне директории.
'diff' обеспечивает несколько способов форматирования своей выдачи. Эти способы управления форматом выдачи могут быть применены к любому из форматов вывода.
Строки текста в некоторых форматах вывода 'diff' предваряются одним или двумя символами, показывающими был ли текст вставлен, удален или изменен. Добавление этих символов может привести к тому, что табуляция перейдет на следующую точку табуляции, игнорируя выравнивание колонок в строке. GNU 'diff' обеспечивает два способа решения этой проблемы.
Первый способ - заставить 'diff' перевести все символы табуляции в правильное количество пробелов перед их выводом; выбор этого метода осуществляется с помощью опции '-t' или '--expand-tabs'. 'diff' считает, что точки табуляции следуют через каждые 8 колонок. Чтобы использовать эту форму вывода с 'patch', нужно задать в 'patch' опцию '-l' или '--ignore-white-space'
Другой способ - добавлять символ табуляции вместо пробела после символа-индикатора в начале строки. Это гарантирует, что все следующие символы табуляции находятся в той же позиции относительно точки табуляции, в которой они были в изначальных файлах, так что вывод будет выравнен правильно. Издержка этого способа в том, что длинные строки могут стать слишком длинными, чтобы поместиться на одной стороке экрана или на бумаге. Он также не работает с унифицированным форматом вывода, в котором нет символов пробела после символа-индикатора. Этот метод выбирается с помощью опции '-T' или '--initial-tab'.
Может оказаться удобным разбивать длинные результаты работы на страницы и проставлять на них время. Опция '-l' или '--paginate' позволяют добиться этого, пропуская результаты работы 'diff' через программу 'pr'. Далее приведен пример заголовока страницы для 'diff -lc lao tzu':
Mar 11 13:37 1991 diff -lc lao tzu Page 1
GNU 'diff' работает довольно эффективно; однако, в некоторых обстоятельствах можно заставить его работать быстрее или производить более компактный набор изменений. Существует два способа, с помощью которых можно влиять на исполнение GNU 'diff' с помощью изменения метода сравнения файлов.
Понятие производительности имеет более чем одну размерность, и не может быть выражено одной константой. Описываемые опции улучшают один параметр исполнения за счет другого, или улучшают исполнение в некоторых случаях, ухудшая его в других.
Метод, с помощью которого GNU 'diff' определяет какие строки изменились, всегда выдает близкий к минимальному набор различий. Обычно этого вполне достаточно для практического применения. Если производительность работы 'diff' достаточно велика, может возникнуть желание заставить 'diff' использовать модифицированный алгоритм, который иногда производит меньшие по объему наборы различий. Это достигается опцией '-d' или '--minimal'; однако это может также вызвать замедление 'diff' по сравнению с обычным режимом; поэтому этот метод не задается по умолчанию.
Когда сравниваемые файлы слишком велики и имеют маленькие группы отличий, рассеянных по ним, можно использовать опцию '-H' или '--speed-large-files' для внесения некоторых изменений в алгоритм, используемый 'diff'. Если входные файлы имеют всюду маленькую плотность изменений, эта опция ускоряет их сравнение без изменений результатов работы. Если нет, 'diff' может произвести больший по объему набор изменений; однако, результаты останутся правильными.
Обычно 'diff' отбрасывает начала и концы, общие для обоих файлов, прежде чем пытается найти минимальный набор различий. Это ускоряет 'diff', но иногда может привести к издержкам в размерах результата. Опция '--horizon-lines=LINES' не дает 'diff' отбрасывать последние LINES строк начала и первые LINES строк конца, что дает 'diff' , больше возможностей для поиска минимального резульлтата.
С помощью программы 'diff3' можно сравнивать три файла и выяснять любые различия между ними. ('diff3' также может объединять файлы; см. "Объединение файлов с помощью 'diff3'").
"Нормальный" формат вывода 'diff3' показывает каждый ханк различий без окружающего контекста. Ханки помечаются метками, показывающими охватывает ли различие 2 или 3 файла и строкой, показывающей их расположение в входных файлах.
См. подробнее о работе 'diff3': "Запуск diff3".
Далее приведен третий образец файла, который будет использоваться в примерах, показывающих резльтаты работы 'diff3', и того, как различные опции могут их менять. Первые два файла - те же, что мы использовали для 'diff' (см. Два образца входных файлов::.). Это третий образец, под названием 'tao':
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
The Nameless is the origin of Heaven and Earth;
The named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their result.
The two are the same,
But after they are produced,
they have different names.
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
Каждый ханк начинается со строки отмеченной '===='. Ханки описывающие различие, охватывающее все три файла содержат просто строку '====', если же различие охватывает только два файла, к строке добавляют '1', '2' или '3', чтобы показать, какой из трех входных файлов имеет отличие в этом ханке. Ханки содержащие копии из двух или трех наборов из входных файлов, предваряются одной или двумя командами определяющими откуда эти строки появились.
Обычно, два пробела предваряют каждую копию выходной строки, чтобы отличить их от команд. Но с опцией '-T' или '--initial-tab', 'diff3' использует табуляцию вместо двух пробелов; такие строки таблуирются правильно. См. подробнее: "Табуляция".
Команды имеют следующие формы:
Этот ханк появляется после строки L файла FILE и не содержит строк в этом файле. Для изменения этого файла до другого файла, нужно добавить строки ханка взятые из других файлов. Например, '1:11a' означает, что ханк следует за строкой 11 в первом файле и не содержит строк из этого файла.
Этот ханк содержит строки из промежутка R файла FILE. Промежуток R - разделенная запятой пара номеров строк, или один номер, если промежуток состоит из одной строки. Для изменения этого файла до другого файла, нужно заменить указанные строки на строки взятые из другого файла. Например, '2:11,13c' означает, что ханк содержит строки с 11 по 13 из второго файла.
Если последняя строка в наборе входных строк неполна (см. Неполные строки::.), она будет выделена при выводе, следующей строкой, начинающейся с символа '\', чтобы отличаться от полной строки.
Группы строк, различающихся в двух или трех входных файлах называются "diff3-ханки", по аналогии с ханками 'diff' (см. Ханки::.). Если все три входных файла различаются в 'diff3'-ханке, ханк называется "тринаправленным ханком"; если только два файла различаются, он называется "двунаправленным".
Как и при работе с 'diff', могут приниматься разные решения какие строки считать одинаковыми. При сравнивании файлов 'A', 'B' и 'C', 'diff3' обычно находит 'diff3'-ханки c помощью объединения двунаправленных ханков, полученных двумя командами 'diff A B' и 'diff A C'. Это необязательно минимизирует размер 'diff3' ханка, но исключения довольно редки.
Например, предположим 'F' содержит три строки 'a', 'b', 'f'; 'G' содержит строки 'g', 'b', 'g'; а 'H' содержит строки 'a', 'b', 'h'. Результаты работы 'diff3 F G H' будут следующими:
====2
1:1c
3:1c
a
2:1c
g
====
1:3c
f
2:3c
g
3:3c
h
потому что найден двунаправленный ханк, содержащий информацию о строке
'a', общей для первого и третьего файла, и строке 'g' из второго
файла; затем, одиночная строка 'b', общая для всех трех файлов; и,
наконец, тринаправленный ханк содержащий последнюю строку каждого
файла.
Далее приведен результат работы команды 'diff3 lao tzu tao' (см. "Третий образец входного файла" для полного содержания файлов). Заметьте, что отображаются только строки, отличающие среди трех файлов.
====2
1:1,2c
3:1,2c
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
2:0a
====1
1:4c
The Named is the mother of all things.
2:2,3c
3:4,5c
The named is the mother of all things.
====3
1:8c
2:7c
so we may see their outcome.
3:9c
so we may see their result.
====
1:11a
2:11,13c
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
3:13,14c
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
Когда два человека вносят изменения в копии одного и того же файла, 'diff3' может произвести объединенную версию этого файла, содержащую одновременно оба набора изменений, и предупреждая о конфликтах.
Можно легко представить программы с именами типа 'diff4' и 'diff5' для сравнения более, чем трех файлов одновременно, но на практике подобная необходимость возникает редко. Можно использовать 'diff3' для объединения трех или более наборов изменений внесенных в файл, путем объединения таких наборов по два.
'diff3' может объединять изменения в двух измененных версиях в общую предшествующую версию. Это позволяет объединять наборы изменений представленных двумя более новыми файлами. Задавайте общую версию-"предка" как второй аргумент и две более новых версии как первый и третий аргументы:
diff3 MINE OLDER YOURS
Нужный порядок аргументов легко запомнить, заметив что они
следуют в алфавитном порядке.
Вы можете представить процесс обработки, как вычитание OLDER из YOURS и прибавление результата к MINE, или как объединение в MINE изменений, которые переводят OLDER в YOURS. Это объединение хорошо определено, если MINE и OLDER совпадают в окрестности каждого такого изменения, напротив это не так, когда все три входных файла различаются или отличие имеется только в файле OLDER; мы называем это "конфликтом". Когда все три входных файла различаются, мы называем такой конфликт "перекрыванием".
'diff3' позволяет обращаться с перекрываниями и конфликтами несколькими способами. Можно пренебрегать перекрытиями и конфликтами, или выделять только перекрытия, или отмечать конфликты специальными строками '<<<<<<<' и '>>>>>>>'.
'diff3' может произвести объединенный результат как скрипт для 'ed', который может быть применен на первом файле, для получения единой версии. Однако, обычно предпочтительнее, чтобы 'diff3' генерировал объединенную версию непосредственно; что автоматически решает нкоторые проблемы связанные с 'ed'.
Можно выбрать все неслитые изменения OLDER от YOURS, для сливания с MINE с помощью опции '-e' или '--ed'. Можно выбрать только неперекрывающиеся неслитые изменения с помощью '-3' или '--easy-only', и выбрать только перекрывающиеся изменения с помощью '-x' или '--overlap-only'.
Опции '-e', '-3' и '-x' отделяют только "необъедененные изменения", т.е. изменения, где MINE и YOURS различаются; они игнорируют различия OLDER и YOURS, в которых MINE и YOURS совпадают, потому что они считают, что такие изменения уже объединены. Если это допущение не справедливо, можно использоывать опцию '-A' или '--show-all' (см. "Пометка конфликтов").
Далее приведен результат команды 'diff3', с каждой из этих трех опций (см. Третий образец входного файла::, для полного содержания файлов). Заметьте, что результат '-e' объединяет несвязанные наборы изменения из результатов '-3' и '-x'.
Результат работы 'diff3 -e lao tzu tao':
11a
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
.
8c
so we may see their result.
.
Результат работы `diff3 -3 lao tzu tao':
8c
so we may see their result.
.
Результат работы `diff3 -x lao tzu tao':
11a
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
.
'diff3' может отмечать конфликты в объединенном результате, заключая их в специальные отмечающие строки. Конфликт, который происходит между файлами A и B отмкчается так:
<<<<<<< A
lines from A
=======
lines from B
>>>>>>> B
Конфликт, происходящий между тремя файлами A, B и C, отмечается
так:
<<<<<<< A
lines from A
||||||| B
lines from B
=======
lines from C
>>>>>>> C
Опция '-A' или '--show-all' действует подобно опции '-e', за
исключением того, что она заключает конфликты в отмечающие строки и
выводит все изменения OLDER от YOURS, а не только необъединенные
изменения. Так, в данных образцами входных файлов (см. "Третий образец
входного файла"), команда 'diff3 -A lao tzu tao' ставит выделяющие
строки вокруг конфликтов, там где различается только 'tzu':
<<<<<<< tzu
=======
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
>>>>>>> tao
и выводит тринаправленный конфликт так:
<<<<<<< lao
||||||| tzu
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
=======
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao
Опция '-E' или '--show-overlap' выводит меньше информации, чем
опция '-A' или '--show-all', потому что ее результаты включают только
необъединенные изменения, и она никогда не показывает содержимого
второго файла. Таким образом, опция '-E' действует подобно опции '-e',
за исключением того, что она заключает в отмечающие строки первый и
третий файл в тринаправленных перекрывающихся изменениях. Подобным
образом, '-X' отличается от '-x', за исключением того, что '-X'
выделяет отмечающими строками все такие (обязательно перекрывающиеся)
изменения. Например, на описанное выше тринаправленное различие, '-E'
и '-X' реагируют одинаково:
<<<<<<< lao
=======
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao
При сравнивании файлов, имеющих малоосмысленные или
неинформативные имена, можно использовать опцию '-L LABEL' или
'--label=LABEL', для отображения альтернативных имен в отмечающих
строках '<<<<<<<', '|||||||' и '>>>>>>>'. Эта опция может быть задана
три раза, по одному для каждого входного файла. Так, 'diff3 -A -L X -L
Y -L Z A B C' действует как 'diff3 -A A B C', за исключением того, что
результаты работы будут выглядеть так, будто обрабатывались файлы с
именами 'X', 'Y', 'Z', а не 'A', 'B' и 'C'.
С помощью опции '-m' или '--merge', 'diff3' производит объединенный файл непосредственно. Это более эффективно, чем использование для этой цели 'ed', и работает даже с нетекстовыми файлами, с которыми 'ed' не работает. Если задать опцию '-m' без опции 'ed'-скрипта, по умолчанию задается опция '-A' ('--show-all').
Например, команда 'diff3 -m lao tzu tao' (см. "Третий образец входного файла" для копий входных файлов) даст следующие результаты:
<<<<<<< tzu
=======
The Way that can be told of is not the eternal Way;
The name that can be named is not the eternal name.
>>>>>>> tao
The Nameless is the origin of Heaven and Earth;
The Named is the mother of all things.
Therefore let there always be non-being,
so we may see their subtlety,
And let there always be being,
so we may see their result.
The two are the same,
But after they are produced,
they have different names.
<<<<<<< lao
||||||| tzu
They both may be called deep and profound.
Deeper and more profound,
The door of all subtleties!
=======
-- The Way of Lao-Tzu, tr. Wing-tsit Chan
>>>>>>> tao
С опцией '-m' неполные строки (см. "Неполные строки") просто копируются в результат так, как они были найдены; если объединенный результат заканчивается на конфликте, и один из входных файлов заканчивается на неполной строке, следующие выделяющие строки ('|||||||', '=======' или '>>>>>>>') появятся не в начале строки, а в другом месте, так как они будут добавлены к неполной строке.
Без опции '-m', если задана опция 'ed' скрипта и найдена неполная строка, 'diff3' генерирует предупреждение и действует так как если бы в этом месте был символ новой строки.
'diff3' в традиционном Unix генерирует 'ed' скрипт без добавления команд 'w' и 'q', сохраняющих изменения. Версия 'diff3' в версии System V генерирует эти дополнительные команды. GNU 'diff3' обычно ведет себя себя подобно 'diff3' в традиционном Unix, но с опцией '-i' он будет действовать как 'diff3' System V и добавлять команды 'w' и 'q'.
Опция '-i' требует одной из опций 'ed' скрипта '-AeExX3' и несовместима с опцией объединенного вывода '-m'.
С помощью 'sdiff', можно объединять два файла интерактивно, основываясь на сравнительном '-y' формате сравнения (см. "Сравнительный формат"). Используйте '-o FILE' или '--output=FILE', чтобы задать местрасположение результирующего объединенного текста. См. подробнее об опциях 'sdiff': "Запуск sdiff".
Другой способ объединения файлов интерактивно - использование пакета Emacs Lisp 'emerge'.
Следующие опции 'sdiff' имеют тоже значение, что и в 'diff'. См. "Опции diff", для получения информации о них.
-a -b -d -i -t -v
-B -H -I REGEXP
--ignore-blank-lines --ignore-case
--ignore-matching-lines=REGEXP --ignore-space-change
--left-column --minimal --speed-large-files
--suppress-common-lines --expand-tabs
--text --version --width=COLUMNS
По историческим причинам, 'sdiff' имеет другие названия для
некоторых опций. Опция '-l' эквивалентна опции '--left-column', а
опция '-s' - опции '--suppress-common-lines'. Значение опций '-w' и
'-W' отличается от аналогичных в 'diff': в 'sdiff' '-w COLUMNS'
эквивалентна '-width=COLUMNS', а '-W' - '--ignore-all-space'. 'sdiff'
без опции '-o' эквивалентен 'diff' с опцией '-y' или 'side-by-side'
(см. Cравнительный формат::.).
Группы общих строк, с пробелом в колонке управляющих символов, копируются из первого файла в результирующий. После каждой группы различающихся строк, 'sdiff' печатает '%' и ждет введения одной из следующих команд. Каждая команда завершается возвратом каретки.
Игнорирует обе версии. Запускает текстовой редактор с временным пустым файлом, затем копирует получившееся в результирующий файл.
Объединяет обе версии, позволяет редактировать объединение во временном файле, затем копирует получившееся в результрующий файл.
Редактирует копию левой версии, затем копирует получившееся в результирующий файл.
Редактирует копию правой версии, затем копирует получившееся в результирующий файл.
Копирует левую версию в результирующий файл.
Выход.
Копирует правую версию в результирующий файл.
Ничего не сообщая, копирует общие строки.
Копирует общие строки, комментируя выполняемые действия. Эта команда принимается по умолчанию.
'patch' применяет результаты сравнения произведенные 'diff' к копии оригинального файла, для производства измененной версии. С помощью 'patch', можно распространять только изменения внесенные в набор файлов, а не весь этот набор; Ваши корреспонденты могут применить 'patch' для приведения в соответствие своих копий с Вашими изменениями. 'patch' автоматически определяет формат, в котором находятся изменения, пропускает начальные и встроенные заголовки, определяя по ним какой файл изменять. Это позволяет Вашим корреспондентам загружать список различий непосредственно в 'patch'.
'patch' обнаруживает и сообщает об общих проблемах, таких как опережающие изменения. Он сохраняет исходную версию обрабатываемых файлов, а также все списки различий, которые не удалось применить. Он также может создавать файл 'patchlevel.h' для обеспечения применения списков различий в правильном порядке.
Программе 'patch' для обработки может быть задана серия списков различий в их стандартной форме, обычно разделенных заголовками, указывающими какой файл следует изменять. Он применяет ханки 'diff' (см. "Ханки") последовательно, один за другим. Если ханк не совсем подходит к оригинальному файлу, 'patch' использует эвристический метод, пытаясь изменить файл так, как сможет. Если не найдено даже приблизительного соответствия, 'patch' отвергает ханк и переходит к следующему. Обычно 'patch' заменяет каждый файл F на его новую версию, сохраняя оригинальный файл в 'F.orig' и помещая отвергнутые ханки (если такие есть) в 'F.rej'.
Обычно 'patch' определяет в каком 'diff'-формате находятся списки различий, анализируя их содержание. Для списков различий, содержащих особенно запутанные заголовки, может оказаться необходимым использовать одну из следующих опций, заставляющих 'patch' воспринимать файлы списков различий как созданные в определенном формате 'diff'. Только перечисленные здесь форматы вывода 'diff' воспринимаются 'patch'.
контекстный формат.
скрипт для редактора 'ed'.
нормальный формат.
унифицированный формат.
'patch' пытается пропускать любой заголовок в списке различий, принимая его, также как и любой вводный текст. Таким образом, можно загружать непосредственно в 'patch' даже сообщение пришедшее по электронной почте, и тем не менее он будет работать. Если весь список различий имеет отступ на некоторое одинаковое число символов пробела или табуляции 'patch' автоматически игнорирует этот отступ.
Однако, могут существовать другие виды несовершенства ввода, требующие вмешательства пользователя.
Иногда программы обработки почты, редакторы или другие программы заменяют пробелы на табуляцию и наоборот. Если это произойдет с файлом, содержащим список различий или со входным файлом, файлы могут выглядеть так же, но 'patch' не сможет работать с ними правильно. При возникновении этой проблемы используйте опцию '-l' или '--ignore-white-space', заставляющая 'patch' не замечать различий в "пропусках", так что любая последовательность "пропусков" в файле списков различий будет соответствовать любой последовательности "пропусков" во входном файле. Остальные символы должны при этом точно соответствовать. Каждая строка строка контекста должна соответствовать строке во входном файле.
Иногда люди запускают 'diff' с новым файлом на первом месте вместо второго. Это создает "реверсивный" список различий. Чтобы применить такой список различий, необходимо задать опцию '-R' или '--reverse'. В этом случае 'patch' пытается перевернуть каждый ханк перед тем как его использовать. Отказы производятся в перевернутом формате. Опция '-R' не работает со скриптами 'ed', потому что в них содержится слишком мало информации для реконструкции обратной операции.
Часто 'patch' может самостоятельно определить, что список различий реверсивный. Если первый ханк списка не работает, 'patch' переворачивает ханк, проверяя нельзя ли применить его таким образом. Если да, 'patch' спрашивает нужно ли установить опцию '-R'; если нет, 'patch' продолжает применять список различий как обычно. Этот метод не позволяет определить реверсивный список различий, если он находится в нормальном формате и первая команда, которую необходимо применить (имеется в виду команда удаления), такова, что ее применение всегда возможно, так как отсутствующий контекст всегда совпадает. Но большинство списков различий скорее добавляют или изменяют строки, а не удаляют их, так что большинство реверсивных списков различий в нормальном формате начинается с удаления, которое не удается применить, что замечает 'patch'.
Если применить список различий, который уже применялся, 'patch' посчитает, что это реверсивный список и запрашивает о его реверсивном применении. Это можно рассматривать как дополнительную возможность. Если вы сделали это по ошибке и не хотите применять список различий реверсивно, ответьте 'n' на этот запрос и на последующий "apply anyway" ("Все равно применить") или наберите 'C-c' для прерывания процесса 'patch'.
Для контекстного формата, и для маленьких списков различий в нормальном формате, 'patch' может определить неправильность указанных в списке различий номеров строк, и попытаться найти правильное место для применения каждого ханка списка. Сначала он пытается работать с номерами строк, указанными в ханке, со смещением, используемым в предыдущем ханке. Если это не срабатывает, 'patch' проверяет текст вперед и назад, ища набор строк соответствующих контексту, указанному в ханке.
Сначала 'patch' пытается найти место полного совпадения строк контекста. Если такого места не найдено, обрабытвается контекстный или унифицированный формат, а показатель максимальной неточности установлен в 1 или более, 'patch' совершает еще один поиск, игнорируя первую и последнюю строки контекста. Если это не помогает, а показатель максимальной неточности установлен на 2 или более, он совершает еще один поиск, игнорируя первые две и последние две строки контекста. Процесс будет продолжаться подобным образом, если показатель максимальной неточности будет иметь еще большее значение.
Опция '-F LINES' или '--fuzz=LINES' устанавливает показатель максимальной неточности равным LINES. Эта опция применима только в контекстном или унифицированном формате; она игнорирует до LINES строк в процессе поиска места для применения ханка. Заметьте, что большее значение показателя неточности увеличивает вероятность неправильного применения списка различий. По умолчанию показатель неточности равен 2; он не может быть больше числа строк контекста в списке различий, обычно равного 3.
Если 'patch' не может найти места для применения ханка из 'patch', он записывает его в reject-файл (см. подробнее о названиях reject-файлов: "Отвергнутые ханки".). Запись производится в контекстном формате вне зависимости от того в каком формате они были в списке различий. Если входной список был в нормальном или 'ed' формате, большинство контекста пусто. Номера строк в ханке из reject-файла могут отличаться от номеров в файле списка различий: они показывают примерное место, где, как предполагает 'patch' несработавшие ханки находились скорее в новом файле, чем в старом.
После выполнения каждого ханка, 'patch' сообщает сработал или не сработал ханк, и если не сработал, то к какой строке (в новом файле), по мнению 'patch' ханк должен был относится. Если последний номер отличается от указанного в списке различий, он сообщает смещение. Одно большое смещение *может* быть следствием того, что 'patch' применил ханк в неправильном месте. 'patch' также сообщает использовался ли показатель неточности для нахождения соответствия, в последнем случае также стоит быть немного подозрительным.
'patch' не может сообщить номера строк, пропущенных в 'ed' скрипте, в нормальном формате может обнаружить неправильные номера строк только в изменяющих или удаляющих командах. Могут возникать некоторые проблемы с контекстным форматом при использовании показателя неточности, равного или большего, чем число строк контекста показываемого в списке различий (обычно равного 3). В этих случаях, бывает полезно самостоятельно рассмотреть контекстный формат списка различий между файлами и посмотреть имеют ли изменения смысл. Завершение работы без ошибок почти всегда показывает что список различий сработал, но не гарантирует этого.
Обычно 'patch' приводит к правильным результатам, даже если он должен часто основываться на предположениях. Однако, результаты гарантированы только если список различий применяется к точной копии файла, для которого был произведен.
Иногда при сравнении двух каталогов, первый каталог содержит файл, которого нет во втором. Если в 'diff' была задана опция '-N' или '--new-file', будет произведен список различий, в котором не будет содержимого такого файла. По умолчанию, 'patch' сохраняет пустой файл, после применения такого списка различий. Опция 'patch' '-E' или '--remove-empty-files' удаляет пустые выходные файлы после применения списка различий.
Если файл списка различий содержит более одного списка различий, 'patch' пытается применить каждый из них, как если бы они содержались в разных файлах. Т.е. он определяет имена файлов, подлежащих обработке в каждом списке различий, и проверяет заголовок каждого списка различий на имена файлов и требуемый номер изменения. (см. подробнее "Создание списков различий".).
Для второго и последующих списков различий в одном файле, можно задать опции и другое имя оригинального файла, разделяя список их аргументов знаком '+'. Однако, список аргументов для второго и последующего файлов не может задавать новый файл, содержащий списки различий, так как это бессмысленно.
Например, для того, чтобы 'patch' отбросил первые три косые черты из имени первого списка различий в файле, и не делал этого ни для одного из последующих списков, а также использавал файл 'code.c' как входной для первого списка, используйте:
patch -p3 code.c + -p0 < patchfile
Опция '-S' или '--skip' игнорирует текущий список различий из
файла, но продолжает искать следующий список в файле. Так, чтобы
игнорировать первый и третий списки различий в файле, используйте:
patch -S + + -S + < patch file
'patch' выдает различные сообщения, особенно, если возникают проблемы с расшифровкой входных данных. В некоторых ситуациях, когда 'patch' не уверен как следует действовать, он обычно запрашивает информацию с клавиатуры. Существуют опции для подавления выдачи нефатальных сообщений и остановки для ввода с клавиатуры.
Сообщение 'Hmm...' означает, что 'patch' считывает текст из файла списка различий, пытаясь определить находится ли список различий в этом файле, и если да, то какого вида.
Можно блокировать все сообщения 'patch', которые не являются сообщениями об ошибке, с помощью опции '-s', '--quiet' или '--silent'.
Существует два способа не давать 'patch' запрашивать информацию. Опция '-f' или '--force' предполаает, что Вы знаете, что делаете. Без запросов совершаются следующие действия:
Далее представлены некоторые моменты, которые следует иметь в виду, при распространении списков различий для обновления пакетов программ.
Убедитесь, что имена файлов были заданы правильно, или в заголовке списка различий или с помощью строки 'Index:'. Если обрабатываются файлы в подкаталоге, убедитесь, что пользователям сообщили об использовании опции '-p' или '--strip' в случае необходимости. Проследите, чтобы среди списков различий не было реверсивных, поскольку при этом бывает не понятно, применялся ли уже список различий.
Чтобы избежать неполного применения списка различий (до применения других списков, предшествующих ему), можно заставить первый список из файла списка различий обновлять файл с именем типа 'patchlevel.h' или 'version.c', содержащий уровень обработки или номер версии. Если входной файл содержит не тот номер версии, 'patch' немедленно об этом сообщит.
Более простой способ решения этой проблемы - помещать строку 'Prereq:' перед каждым списком различий. Если заголовок в списке различий содержит строку, начинающуюся с 'Prereq:', 'patch' рассмотрит следующее слово в этой строке (означающее номер версии) и проверит содержится ли оно во входном файл, предваряемое "пропуском" или символом новой строки. Если нет, 'patch' подтвердит это перед тем как продолжит. Это затруднит применение списков различий в неправильном порядке.
Поскольку 'patch' не может правильно обрабатывать неполные строки, при производстве каждой новой версии убеждайтесь, что все исходные файлы Вашей программы заканчиваются символом новой строки.
Для создания списка разлчий, меняющего старую версию пакета на новую, прежде всего создайте копию старой версии во временном каталоге. Обычно это достигается с помощью распаковки 'tar' или 'shar' архива старой версии.
Можно снизить размер списка различий путем переименования или переноса некоторых файлов перед созданием списка. Если старая версия пакета содержит какие-либо файлы, несодержащиеся в новой версии, или если какие-либо файлы были переименованы, создайте список из 'rm' и 'mv' команд для применения пользователем в каталоге со старой версией перед применением списка различий. После чего примените эти команды сами во временном каталоге.
Если есть файлы, которые не нужно включать в список различий, потому что они строятся из других файлов (например, 'TAGS' и результаты работы 'yacc' и 'makeinfo'), замените их версии во временном каталоге на новые, с помощью команд 'rm' и 'ln' или 'cp'.
Теперь можно создавать список различий. Контекстный формат, являющийся де-факто, стандартным форматом 'diff' для распространения списков различий, задается опцией '-C 2'. Не используйте меньше двух строк контекста, так как 'patch' обычно необходимо по крайней мере две строки для правильной работы. Используйте опцию '-P' в случае, если пакет новой версии содержит какие-либо файлы, несодержащиеся в старой. Убедитесь, что временный каталог задан первым, а новый каталог вторым.
Добавьте в начале списка различий примечание, сообщающее пользователю все команды 'rm' и 'mv', которые необходимо запустить перед применением списка различий. После этого можно удалить временный каталог.
Команда 'cmp' сравнивает два файла, и если они различаются, сообщает о первом байте и строке, где было обнаружено различие. Формат этой команды следующий:
cmp OPTIONS... FROM-FILE [TO-FILE]
Имя файла '-' означает стандартный ввод. 'cmp' также использует
стандартный ввод, если один из файлов не задан.
Выходной статус 0 означает, что различий не найдено, 1 - найдено, 2 - обнаружена ошибка.
Далее приводится суммарное изложение опций воспринимаемых GNU 'cmp'. Большинство опций имеют два эквивалентных имени, одно из которых - буква, предваряемая '-', а второе - длинное имя, предваряемое '--'. Объединение однобуквенных опций (если они не имеют аргумента) может быть скомбинировано в одну слово командой строки: '-cl' эквивалентно '-c -l'.
Печатает различающиеся символы. Отображает контрольные символы, символом '^' и буквой алфавита, а также предваряет символы с установленным высшим битом символом '-M' (обозначающим "мета").
Игнорирует все различия в первых BYTES байтах входных файлов. Обращается с файлами меньшими по размеру, чем BYTES байтов как с пустыми.
Печатает смещение (десятичное) и значение (восьмеричное) всех различающихся байтов.
Печатает все различающие символы. Отображает контрольные символы, символом '^' и буквой алфавита, а также предваряет символы с установленным высшим битом символом '-M' (обозначающим "мета").
Ничего не печатает; только возвращает выходной статус, показывающий отличаются ли файлы.
Печатает смещение (десятичное) и значение (восьмеричное) всех различающихся байтов.
Выдает номер версии 'cmp'.
Формат запуска команды 'diff' следующий:
diff OPTIONS... FROM-FILE TO-FILE
В простейшем случае, 'diff' сравнивает содержимое двух файлов
FROM-FILE и TO-FILE. Имя файла '-' обозначает текст, считываемый с
помощью стандартного ввода. В частности, 'diff - -' сравнивает копию
стандартного ввода саму с собой.
Если FROM-FILE - каталог, а TO-FILE - нет, 'diff' сравнивает файл из FROM-FILE, чье имя совпадает с TO-FILE; и наоборот. В этой ситуации, файл, не являющийся каталогом, не должен быть '-'.
Если и FROM-FILE, и TO-FILE - каталоги, 'diff' сравнивает соответствующие файлы в этих каталогах, в алфавитном порядке; это сравнение не является рекурсивным, если не указана опция '-r' или '--recursive'. 'diff' никогда не сравнивает содержимое каталогов, как файлов. Файл, заданный полностью, не может быть введен стандартным вводом, потому что стандартный ввод безымянен и понятие "файл с тем же именем" неприменимо.
Опции 'diff' начинаются с '-', так что обычно имена FROM-FILE и TO-FILE не могут начинаться с '-'. Однако, '--' как аргумент сам по себе заставляет воспринимать оставшиеся аргументы как имена файлов, даже если они начинаются с '-'.
Код завершения 0 означает, что различий не найдено, 1 - найдены некоторые различия, 2 - обнаружена ошибка.
Далее приводится суммарное изложение опций воспринмаемых GNU 'diff'. Большинство опций имеют два эквивалентных имени, одно из которых - буква, предваряемая '-', а второе - длинное имя, предваряемое '--'. Объединение однобуквенных опций (если они не имеют аргумента) может быть скомбинировано в одну слово командой строки: '-ac' эквивалентно '-a -c'. Опции с длинными именами могут быть сокращены любым уникальным началом их имени. Квадратные скобки ([ и ]) означают, что у опции необязательный аргумент.
Показывает LINES (целое число) строк контекста. Эта опция не задает сама по себе формат вывода; и не действует без опции '-c' (см. Контекстный формат::.) или '-u' (см. Унифицированный формат::.). Эта опция является устаревшей. Для правильной работы, 'patch' обычно необходимо по крайней мере две строки контекста.
'-a' Воспринимает все файлы как текстовые и сравнивает их строка за строкой, даже если они не похожи на текст. Cм. "Двоичные файлы и принудительное текстовое сравнение".
Игнорирует изменения в количестве "пропусков" (пробелов, табуляций, и т.д.). См. "Пропуски".
Игнорирует изменения - вставки и удаления пустых строк. См. "Пустые строки".
Считывает и записывает данные в двоичном формате. См. "Двоичный формат".
Сообщает только отличаются ли файлы, не уточняя различий.
Задает контекстный формат.
При использовании контекстного формата, показывает LINES (целое) строк контекста, или три, если LINES не указано. Для правильной работы, 'patch' необходимо по крайней мере две строки контекста.
Использует FORMAT для вывода групп строк содержащих различающиеся строки из обоих файлов в формате if-then-else. Cм. "Формат групп строк".
Изменяет алгоритм, возможно находя меньший набор изменений. Это замедляет 'diff' (иногда очень сильно). См. "Издержки в производительности diff".
Задает объединенный формат вывода '#ifdef', в соответствии с макросом препроцессора NAME. См. "Детальное описание формата if-then-else".
Задает вывод в формате 'ed' скрипта. См. "ed-скрипт формат".
При сравнивании каталогов, игнорирует файлы и подкаталоги, имена которых совпадают с шаблоном. См. "Сравнение каталогов".
При сравнивании каталогов, игнорирует файлы и подкаталоги, начинающиеся с шаблонов, содержащихся в FILE. См. "Сравнение каталогов".
Заменяет табуляцию на пробелы при выводе, для сохранения выравнивания по табуляции во входных файлах.
Задает формат вывода подобный 'ed' скрипту, но с изменением порядка ханков. См. "Прямой ed формат".
В контекстном и унифицированном форматах, для каждого ханка различий, показывает ближайшую предшествующую строку, соответствующую регулярному выражению REGEXP. См. "Задание заголовков".
Задает формат вывода подобный 'ed' скрипту, но с изменением порядка ханков. См. "Прямой ed формат".
Эта опция в данный момент не используется; присутствует для совместимости с другими версиями Unix.
Использует эвристику для быстрой обработки больших файлов, имеющих много рассеянных маленьких изменений. Cм. "Издержки в производительности diff".
Не дает отбрасывать последние LINES строк начала и первые LINES строк конца файла. См. "Издержки в производительности diff".
Игнорирует изменения в строчных и прописных буквах, считая их эквивалентными.
Игнорирует изменения - вставки и удаления строк, соответствующих регулярному выражению REGEXP.
Игнорирование "пропусков" при сравнении строк. См. "Пропуски".
Игнорирует изменения - вставки и удаления пустых строк. См. "Пустые строки".
Игнорирует изменения в строчных и прописных буквах, считая их эквивалентными.
Игнорирует изменения - вставки и удаления строк соответствующих регулярному выражению REGEXP.
Игнорирует изменения в количестве "пропусков". См. "Пропуски".
Заменяет на табуляцию пробелы перед текстом строки в нормальном или контекстном формате. Благодаря этому выравнивание по табуляции в строках выглядит нормально.
Пропускает результаты работы через 'pr' для разбивки на страницы. См. "Разбивка результатов diff на страницы".
Использует LABEL вместо имени файла в заголовках контекстного (см. "Контекстный формат") и унифицированного формате (см. "Унифицированный формат").
Использует LABEL вместо имени файла в заголовках контекстного (см. "Контекстный формат") и унифицированного (см. "Унифицированный формат") форматов.
Печатает только левую колонку для двух общих строк в сравнительном формате. См. "Сравнительный формат".
Использует FORMAT для вывода всех входных строк в формате if-then-else. См. "Строчный формат".
Изменяет алгоритм, возможно находя меньший набор изменений. Это замедляет 'diff' (иногда очень сильно). См. "Издержки в производительности diff".
Задает RCS-формат списков разлчий; аналогичен '-f' за исключением того, что в каждой команде указывает номер строки, на которую она действует.
При сравнении каталогов, если файл найден только в одном каталоге, считает что он находится и во втором, но является пустым. См. "Сравнение каталогов".
Использует FORMAT для вывода группы строк, взятой из второго файла (присутствующей только в нем) в формате if-then-else. См. "Форматы группы строк".
Использует FORMAT для вывода группы строк, взятой из первого файла (присутствующей только в нем) в формате if-then-else. См. "Форматы группы строк".
Использует FORMAT для вывода строки, взятой из первого файла (присутствующей только в нем) в формате if-then-else. См. "Форматы группы строк".
Показывает к какой функции C относится каждое изменение. См. "Заголовки функций С".
При сравнении каталогов, если файл находится только в одном каталоге из двух, считает что он находится и в первом, но является пустым. См. "Сравнение каталогов".
Пропускает результаты работы через 'pr' для разбивки на страницы. См. "Разбивка результатов diff на страницы".
Сообщает только что файлы различаются, не уточняя различий.
При сравнивании каталогов, рекурсивно сравнивает все найденные подкаталоги. См. "Сравнение каталогов".
Задает RCS-формат; аналогичен '-f', за исключением того, что в каждой команде указывает номер строки, на которую она действует.
При сравнивании каталогов, рекурсивно сравнивает все найденные подкаталоги. См. "Сравнение каталогов".
Сообщает об одинаковых файлах. См. "Сравнение каталогов".
Сообщает об одинаковых файлах. См. "Сравнение каталогов".
При сравнивании каталогов начинает с файла FILE. Это позволяет возобновлять прерванное сравнение. См. "Сравнение каталогов".
Печатает дополнительную информацию в помощь 'sdiff'. 'sdiff' использует эту опцию при запуске 'diff'. Эта опция не задумана для прямого использования пользователями.
Показывает к какой функции C относится каждое изменение. См. "Заголовки функций С".
В контекстном и унифицированном форматах, для каждого ханка различий, показывает ближайшую предшествующую строку, соответствующую регулярному выражению.
Задает сравнительный формат. См. "Сравнительный формат".
Использует эвристику для быстрой обработки больших файлов, имеющих много рассеянных маленьких изменений. Cм. "Издержки в производительности diff".
При сравнивании каталогов начинает с файла FILE. Это позволяет возобновлять прерванное сравнение. См. "Сравнение каталогов".
Не печатет общие строки в сравнительном формате. См. "Сравнительный формат".
Заменяет табуляцию на пробелы при выводе, для сохранения выравнивания по табуляции во входных файлах.
Заменяет на табуляцию пробелы перед текстом строки в нормальном или контекстном формате. Благодаря этому выравнивание по табуляции в строках выглядит нормально.
Рассматривает все файлы как текстовые и сравнивает их строка за строкой, даже если они не похожи на текст.
Задает унифицированный формат. См. "Унифицированный формат".
Использует FORMAT для вывода общей группы строк, взятой из обоих файлов в формате if-then-else. См. "Строчный формат".
Использует FORMAT для вывода общей строки, взятой из обоих файлов в формате if-then-else. См. "Строчный формат".
При сравнении каталогов, если файл находится только в одном каталоге из двух, считает что он находится и в первом, но является пустым. См. "Сравнение каталогов".
Задает унифицированный формат, показывающий LINES (целое) строк контекста, или три, если LINES не задано. См. "Унифицированный формат". Для правильной работы, 'patch' необходимо по крайней мере две строки контекста.
Выводит номер версии 'diff'.
Игнорирует "пропуски" при сравнении строк.
Задает ширину вывода равную COLUMNS в сравнительном формате. См. "Сравнительный формат".
При сравнивании каталогов, игнорирует файлы и подкаталоги, имена которых начинаются с PATTERN. См. "Сравнение каталогов".
При сравнивании каталогов, игнорирует файлы и подкаталоги, соответствующие шаблонам, содержащимся в файле FILE. начинающиеся с $$patterns$$, содержащихся в FILE. См. "Сравнение каталогов".
Задает сравнительный формат. См. "Сравнительный формат".
Команда 'diff3' сравнивает три файла и выводит описание их различий. Ее формат следующий:
diff3 OPTIONS... MINE OLDER YOURS
Сравниваемые файлы - MINE, OLDER и YOURS. Одно (но не больше) из
трех имен файлов может быть '-', что означает для 'diff3', что
соответствующий файл должен читаться из стандартного ввода.
Результат завершения 0 означает что 'diff3' успешно завершил работу, 1 - найдены конфликты, 2 - обнаружена ошибка.
Далее приводится суммарное изложение опций воспринимаемых GNU 'diff3'. Объединение однобуквенных опций (если они не имеют аргумента) может быть скомбинировано в одну слово командой строки.
Воспринимает все файлы как текстовые и сравнивает их строка за строкой, даже если они не похожи на текст.
Объединяет все изменения от OLDER к YOURS в MINE, выделяя все конфликты специальными отмечающими строками. См. "Пометка конфликтов".
Задает вывод в формате 'ed' скрипта, объединяющий все изменения от OLDER к YOURS в MINE.
Аналогичен '-e', за исключением специальных отмечающих строк с перекрывающимися изменениями первого и третьего файлов. См. "Пометка конфликтов". С '-E', перекрывающиеся изменения выглядят так:
<<<<<<< MINE
lines from MINE
=======
lines from YOURS
>>>>>>> YOURS
Генерирует 'ed' скрипт, объединяющий все изменения от OLDER к YOURS в MINE.
Аналогичен '-e', за исключением того, что выводит только неперекрывающиеся изменения.
Генерирует 'w' и 'q' команды в конце 'ed' скрипта для совместимости с System V. Эта опция должна комбинироваться с одной из опций '-AeExX3', и не должна комбинироваться с '-m'. См. "Сохранение измененных файлов".
Заменяет на табуляцию два пробела перед текстом строки в нормальном формате. Благодаря этому выравнивание по табуляции в строках выглядит нормально.
Использует метку LABEL для специальных отмечающих строк выводимых опциями '-A', '-E' и '-X'. Эта опция может быть задана три раза, по одному для каждого входного файла. По умолчанию метки - имена входных файлов. Так 'diff3 -L X -L Y -L Z A B C' действует подобно 'diff3 -m A B C', за исключением того, что результаты работы выглядят как будто обрабатывались файлы 'X', 'Y' и 'Z', а не 'A', 'B' и 'C'. См. "Пометка конфликтов".
Применяет скрипт редактора к первому файлу и выдает результат стандартным образом. В отличие от пропускания результатов 'diff3' через 'ed', это работает даже для двоичных файлов и неполных строк. Предполагается, что задана опция '-A', если не указано опции для скрипта редактирования.
Аналогично '-e', за исключением того, что выводятся только перекрывающиеся изменения.
Объединяет все неслитые изменения от OLDER к YOURS в MINE, заключая все перекрывающиеся изменения в ограничивающие строки.
Аналогично '-e', за исключением ограничивающих строк для перекрывающихся изменений первого и третьего файлов.
Заменяет на табуляцию пробелы перед текстом строки в нормальном или контекстном формате. Благодаря этому выравнивание по табуляции в строках выглядит нормально.
Рассматривает все файлы как текстовые и сравнивает их строка за строкой, даже если они не похожи на текст.
Выводит номер версии 'diff3'
Аналогично '-e', за исключением того, что выводятся только перекрывающиеся изменения.
Аналогично '-E', за исключением того, что выводятся только перекрывающиеся изменения. Другими словами, как '-x', за исключением того, что выводятся строки-скобки как в '-E'
Аналогично '-e', за исключением того, что выводятся только неперекрывающиеся изменения.
Как правило, 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.
Опция 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'.
По умолчанию, '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. Кроме того, распознаются более понятные синонимы этих значений. Допустимые значения перечислены ниже; можно указывать однозначно определяемые сокращения.
Всегда делать пронумерованные резервные копии.
Делать нумерованные резервные копии для файлов, для котороых уже имеются резервные копии и простые копии для остальных. Это значение принимается по умолчанию.
Всегда делать простую резервную копию.
Если резервная копия уже существует, patch создает новую резервную копию, изменяя первую встретившуюся в имени маленькую букву на соответствующую большую букву. Если больших букв нет в имени, то удалятся первый символ из имени. Это повторяется до тех пор, пока не будет получено имя файла, которой еще не существует.
Если Вы указываете имя выходного файла с помощью опции '-o', то создается резервная копия файла, указанного как ее аргумент, а не входного файла.
Имена файлов отвергнутых изменений (файлы, содержащие те изменения, которые patch не смог применить, поскольку не нашел соответствующего места) по умолчанию строятся приписыванием суффикса '.rej' (или '#' - для систем, не поддерживающих длинные имена файлов).
Вы можете явно указать patch, что он должен помещать все отвергнутые изменения в один файл. Опция '-r REJECT-FILE' или '--reject-file=REJECT-FILE' позволяет использовать REJECT-FILE как имя для файла отвергнутых изменений.
В этом разделе приводится полный список опций, которые понимаются программой 'patch'. Старые версии 'patch' не воспринимают опции с длинными именами и опции '-t', '-E' и '-V'.
Несколько однобуквенных опций без аргументов могут быть объединены в один аргумент командной строки (записывается один символ '-', за которым следуют буквы, соответствующие этим опциям). Квадратные скобки ([ и ]) показывают что опция может иметь необязательный аргумент.
Использовать BACKUP-SUFFIX как расширение для имен файлов с резервными копиями вместо '.orig' или '~'
Использовать BACKUP-PREFIX как префикс для имени файла с резервной копией. Если эта опция указано, то опция '-b' игнорируется.
Не задавать никаких вопросов (пакетный режим работы).
Рассматривать файл изменений как выдачу diff в контекстном формате.
Каталог DIRECTORY рассматривается как текущий каталог для интерпретации имен файлов, заданных в пакетном файле и в качестве аргументов для других опций.
Выполняет слияние в формате if-then-else. NAME - имя переменной.
Установка внутренних отладочных флагов. Опция представляет интерес только для тех, кто сам патчит (модифицирует) patch.
Файл изменений интерпретируется как скрипт для ed.
Удалять выходные файлы, которые оказались пустыми в результате применения изменений.
Считать, что пользователь уверен в своих действиях, и не задавать никаких вопросов.
Установить значение показателя максимальной неточности в LINES.
Считать, что пользователь уверен в своих действиях, и не задавать никаких вопросов.
Игнорировать изменения, которые patch считает реверсивными или уже примененными. См. также '-R'
Установить значение показателя максимальной неточности в LINES.
Печать справочной информации об опциях, воспринимаемых программой patch.
Выполняет слияние в формате if-then-else. NAME - имя переменной.
Любая последовательность символов-разделителей в файле изменений считается совпадающей с любой последовательностью символов-разделителей во входном файле.
Файл изменений рассматривается как результат работы diff в нормальном формате.
Игнорировать изменения, которые patch считает реверсивными или уже примененными. См. также '-R'
OUTPUT-FILE используется как имя выходного файла.
Устанавливает количество отсекаемых имен каталогов в NUMBER.
Использовать BACKUP-PREFIX как префикс для имени файла с резервной копией. Если эта опция указано, то опция '-b' игнорируется.
Работать без выдачи любых сообщений до момента возникновения ошибки.
Использовать REJECT-FILE как имя файла отвергнутых изменений.
Считать, что при создании файла различий имена старого и нового файлов были указаны наоборот (реверсивное изменение).
Использовать REJECT-FILE как имя файла отвергнутых изменений.
Удалять выходные файлы, которые оказались пустыми в результате применения изменений.
Считать, что при создании файла различий имена старого и нового файлов были указаны наоборот (реверсивное изменение).
Работать без выдачи любых сообщений до момента возникновения ошибки.
Пропустить данное изменение из файла изменений, но продолжать обработку со следующего изменения в файле.
Работать без выдачи любых сообщений до момента возникновения ошибки.
Пропустить данное изменение из файла изменений, но продолжать обработку со следующего изменения в файле.
Устанавливает количество отсекаемых имен каталогов в NUMBER.
Использовать BACKUP-SUFFIX как расширение для имен файлов с резервными копиями вместо '.orig' или '~'
Не задавать никаких вопросов.
Рассматривать файл изменений как результат работы diff в унифицированном формате.
Вывести номер версии patch.
Выбрать способ создания резервных копий изменяемых файлов.
Вывести номер версии patch.
Выбрать способ создания резервных копий изменяемых файлов.
Установка внутренних отладочных флагов. Опция представляет интерес только для тех, кто сам патчит (модифицирует) patch.
Команда sdiff выполняет слияние двух файлов и интерактивно показывает результаты слияния. Формат командной строки следующий:
sdiff -o OUTFILE OPTIONS... FROM-FILE TO-FILE
Эта команда выполняет слияние файла FROM-FILE с файлом TO-FILE, и
выдает результат слияния в файл OUTFILE. Если FROM-FILE - это имя
каталога, а TO-FILE - нет, то sdiff сравнивает файл в каталоге
FROM-FILE с именем, таким же как TO-FILE; то же самое происходит, если
FROM-FILE - имя файла, а TO-FILE - имя каталога. FROM-FILE и TO-FILE
оба не могут быть каталогами.
Опции sdiff начинаются с символа '-', поэтому имена файлов FROM-FILE и TO-FILE просто так не могут начинаться с символа '-'. Однако, если встречается аргумент '--', то все остальные аргументы считаются именами файлов, даже если они начинаются с символа '-'. Нельзя использовать '-' в качестве входного файла.
Код завершения 0 означает, что различия не были обнаружены, 1 что были обнаружены различия, и 2 - означает, что при исполнении обнаружена ошибка.
При вызове sdiff без опции '-o' (или '--output') различия выдаются в сравнительном формате. Не рекомендуется использовать эту опцию, так как она устаревает и будет отсутствовать в последующих версий. Вместо нее следует использовать diff --side-by-side.
Далее приводится суммарное изложение опций воспринмаемых GNU 'sdiff'. Большинство опций имеют два эквивалентных имени, одно из которых - буква, предваряемая '-', а второе - длинное имя, предваряемое '--'. Объединение однобуквенных опций (если они не имеют аргумента) может быть скомбинировано в одну слово командой строки: '-ac' эквивалентно '-a -c'. Опции с длинными именами могут быть сокращены любым уникальным началом их имени.
Все файлы рассматриваются как текстовые и выполняется их построчное сравнение, даже если они и не похожи на текст.
Игнорировать различия в количестве символов-разделителей.
Игнорировать различия в количестве вставленных или удаленных пустых строк.
Изменить алгоритм с тем, чтобы найти наименьший набор изменений. Это приводит к замедлению работы sdiff (иногда к значительному замедлению).
Использовать эвристики для ускорения обработки больших файлов, которые имеют несколько разрозненных небольших изменений.
Расшивать символы табуляции в пробелы при выводе для того, чтобы сохранить выравнивание, выполненное с помощью символов табуляции во входных файлах.
Игнорировать различия в регистре символов; одинаковые большие и маленькие буквы считаются совпадающими.
Игнорировать изменения, которые произошли в результате вставки или удаления строк, которые описываются регулярным выражением REGEXP.
Игнорировать количество символов-разделителей при сравнении строк.
Игнорировать изменения, произошедшие в результате вставки или удаления пустых строк.
Игнорировать различия в регистре символов; одинаковые большие и маленькие буквы считаются совпадающими.
Игнорировать изменения, которые произошли в результате вставки или удаления строк, которые описываются регулярным выражением REGEXP.
Игнорировать количество символов-разделителей при сравнении строк.
Печатать только левую колонку для двух общих строк.
Изменить алгоритм с тем, чтобы найти наименьший набор изменений. Это приводит к замедлению работы sdiff (иногда к значительному замедлению).
Поместить результат объединения файлов в файл FILE. Эта опция требуется при слиянии файлов.
Не печатать общие строки файлов.
Использовать эвристики для ускорения обработки больших файлов, которые имеют несколько разрозненных небольших изменений.
Расшивать символы табуляции в пробелы при выводе для того, чтобы сохранить выравнивание, выполненное с помощью символов табуляции во входных файлах.
Все файлы рассматриваются как текстовые и выполняется их построчное сравнение, даже если они и не похожи на текст.
Вывести номер версии программы sdiff.
Считать ширину строки при выводе COLUMNS символов. Заметим, что по историческим причинам, соответствующая опция для команды diff -W, а для команды sdiff -w.
Игнорировать несовпадения в количестве горизонтальных символов-разделителей при сравнении строк. Заметим, что по историческим причинам, соответствующая опция для команды diff -w, а для команды sdiff -W.
В случае, когда входной файл заканчивается символом, отличным от символа конца строки, последняя строка этого файла называется незавершенной строкой. Все другие строки называются полными строками, и завершаются символом перехода на новую строку. Незавершенные строки не совпадают с полными строками, даже если игнорируются различия в количестве символов-разделителей.
Незавершенная строка обычно отличается при выводе от полной строки следующей строкой, которая начинается с символа '\'. Однако при выводе в RCS-формате незавершенная строка выводится как есть, без завершающего символа перехода на новую строку. Сравнительный формат обычно представляет незавершенную строку как есть, но в некоторых случаях используется маркеры '/' или '\'. При описании шаблонов строк для формата if-then-else, %L позволяет сохранить незавершенность строки, и %l приводит к выводу символа новой строки. Наконец, для формата ed и прямого формата ed, diff не может представить незавершенную строку, поэтому в результате появляется завершенная строка и выдается сообщение об ошибке.
Например, допустим, что F и G - однобайтовые файлы, которые содержат символы 'f' и 'g' соответственно.
1c1
< f
\ No newline at end of file
--
> g
\ No newline at end of file
(Точное содержимое сообщения может быть другим в национальных
версиях diff). 'diff -n -F G' приведет к выводу следующего текста без
завершающего символа перехода на новую строку:
d1 1
a1 1
g
Команда 'diff -e F G' приведет к появлению двух сообщений об
ошибке и выдаче следующего:
1c
g
.