Представьте, что одним прекрасным днем вы просыпаетесь и понимаете, что ваш программный комплекс не работает, в нем есть ошибка, которую необходимо найти. Такое и в страшном сне не присниться.
Кроме того, вы понимаете, что вам нужно сравнить код двух версий, и вы вынуждены вернуться к предыдущей версии системы. Все паникуют, и это абсолютно нормально!
Благо, есть такая утилита Linux под названием diff, которая прикроет вашу спину.
Что такое команда diff?
Довольно часто применяется такая операция, как сравнение файлов и поиск различий между ними. Особенно полезна такая операция в случае, если вам нужно сравнить файлы со сложным кодом или файлы конфигурации.
Вместо того, чтобы сравнивать эти файлы вручную (что может повлечь за собой человеческий фактор), вы можете воспользоваться встроенной мощной утилитой Linux под названием diff. Кроме того, вы можете сэкономить свое время.
Помимо команды diff, у Linux также есть еще одна команда, с помощью которой вы можете применить изменения одного файла к другому, и это команда patch. В этой статье мы подробно рассмотрим эти многофункциональные и крайне интересные команды, чтобы узнать, как их можно применять.
Синтаксис команды diff
Ниже представлен синтаксис команды diff:
diff [options] file1 file2
Синтаксис diff
В зависимости от изменений, команда diff может отображать три символа:
Символ |
Значение |
c |
CHANGE – необходимо внести изменения. |
d |
DELETE – необходимо что-то удалить. |
a |
ADD – необходимо что-то добавить. |
В выводе команды diff символ < указывает на первый файл, а символ > - на второй, который используется в качестве ссылки.
Давайте взглянем на несколько примеров, как можно использовать команду diff.
Примеры использования команды diff
Для того, чтобы показать, что файлы одинаковы, вместе с командой diff мы используем флаг -s. В данном примере два файла (fileA и sameAsfileA) имеют одинаковое содержимое.
В следующем примере у нас есть два файла, содержимое которых отличается. В выводе, продемонстрированном ниже, команда diff показывает, что в файле showList_v2.js необходимо изменить строки с номерами 11 и 14, чтобы они соответствовали строкам с номерами 11 и 13 в файле showList_v1.js.
Следующий вариант использования команды diff - мой любимый. А все потому, что вы можете наглядно видеть различия.
Просто воспользуйтесь флагом -y, как показано ниже:
diff -y file1 file2
Наглядное сравнение файлов
Последний пример, который бы я хотел привести – это пример унифицированного вывода. Эти выходные данные зачастую используются в качестве входных данных для команды patch. Заодно мы посмотрим, как работает команда patch:
Унифицированный вывод, который используется в качестве входных данных для команды patch
Ниже вы можете видеть несколько других полезных флагов, который можно использовать с командой diff:
- -i - флаг позволяет игнорировать регистр. По умолчанию команда diff чувствительна к регистру.
- -w - флаг позволяет игнорировать пробелы в файле. По умолчанию пробелы тоже сравниваются.
Синтаксис команды patch
Вы регулярно вносите изменения в свой код, и для того, чтобы обмениваться отредактированными и исправленными файлами после каждого внесенного изменения, нужно много времени, и это практически невозможно. Как правило, разработчики делятся с командой своими исправлениями в коде, поэтому они сразу же применяются.
Использование команды patch - это самый безопасный способ передачи этих исправлений.
Давайте взглянем, как работает команда patch:
patch file_to_change < patch_file
Синтаксис команды patch
Примеры использования команды patch
Вот пример внесения исправлений: допустим, что у нас есть простой код JavaScript [имя файла: print_in_js,js], который печатает строку.
И все-таки в этой функции печати что-то не так, и для того, чтобы выяснить, что именно, нам нужно провести тестирование. Отправляем файл print_in_js,js нашему коллеге, он его исправляет и отправляет обратно нам.
Для начала наш коллега находит неправильный тип в строке под номером 3. Он исправляет файл.
После того, как он исправил файл и убедился, что код работает, он создает «заплатку».
diff -u print_in_js.js print_in_js_Fixed.js > patched_print_js.diff
Создание «заплатки»
Давайте проверим содержимое этой «заплатки»:
Содержимое «заплатки»
Теперь, когда у нас есть «заплатка», мы можем ее применить:
patch print_in_js.js < patched_print_js.diff
Применение «заплатки»
Исправленный код после применения «заплатки»
И да, наш код исправлен!
Заключение
Создавать и применять «заплатки» с помощью команд patch и diff довольно легко. Аналогичный подход используют системы контроля версий, например, Git или SVN. Изучив основы, вы с легкостью сможете понять, как работает контроль версий, и начать его использовать, ведь именно он является важным аспектом разработки программного обеспечения.