Автор — Lucas Westermann

Перед тем, как начать статью, я хочу упомянуть письмо одного читателя: Alexander любезно подсказал мне приложение gstm с графическим интерфейсом, которое осуществляет ssh-туннелирование. Находка для тех читателей, которые предпочитают использовать приложения с графическим интерфейсом везде, где это возможно. Приложение доступно в репозитории universe. А читатель (или читательница?), который, к сожалению, не представился (но Вы знаете, о ком я сейчас!), указал на упущение в моей статье из FCM №37 в разделе C&C: я не указал, что надо заменить «localhost» на IP-адрес вашего сервера (команда выглядела как «ssh -D 8080 lswest@localhost», где «lswest@localhost» надо было заменить на «имя_учётной_записи@IP_адрес_сервера»). Простите, если я кого-то запутал.

В этом месяце я занимался переписыванием нескольких патчей для DWM (Dynamic Window Manager), чтобы они работали с патчем pango, который добавляет поддержку xft-шрифтов для панели статуса DWM. Занимаясь этим, я немного изучил diff и решил поделиться своими достижениями с вами, дорогие читатели. Вы можете спросить: «Зачем мне изучать diff, если я не использую DWM и не создаю патчи?» Дело в том, что diff может пригодиться во многих ситуациях. Допустим, вы пишете сценарий и хотите дополнить его, но для этого нужна старая версия, для другого компьютера. Вместо создания и хранения двух разных сценариев можно создать скрипт, скопировать его, внести изменения в копию и создать diff-файл. Затем сохранить оригинал и diff-файл, избавив себя от лишней работы в будущем. Или вы хотите помочь другу, но по каким-то причинам не можете переслать файл, над которым работали. Зато вы можете переслать diff-файл для внесения изменений. Найдётся множество других примеров использования (подгонка файлов конфигурации и т. д.), над которыми я ещё не думал.

По умолчанию утилита diff установлена в большинстве дистрибутивов. Если её нет в вашей Ubuntu, то установить её можно следующей командой:

sudo apt-get install diff

После этого всё готово. Для создания diff-файла требуется два файла: «оригинал» (с этого момента я так и буду его называть) и «изменённый».

Для простоты давайте условимся, что у меня файл, который содержит:

VirtualBox How-To (подготовка, установка и настройка виртуальной машины). Цикл «Виртуализация»: Каждый месяц писать по статье на дистрибутив, со снимками экрана и прочим. C&C: Описать полезные вещи, которые можно сделать с помощью curl, wget и прочего? А diff?

И я хочу изменить это на:

VirtualBox How-To (подготовка, установка и настройка виртуальной машины). Цикл «Виртуализация»: Каждый месяц писать по статье на дистрибутив, со снимками экрана и прочим. C&C: Diff (wget и curl в следующем месяце).

Надо внести изменения в «изменённый» файл. Я добавляю «-patched» к имени файла в конце. После внесения изменений я создаю diff-файл, набирая в терминале следующее:

diff -up оригинал изменённый > articles/list/update.diff

Замените «оригинал» и «изменённый» реальными именами файлов и путями. Если вы не хотите, чтобы diff-файл создался в текущей директории, то вам нужно добавить путь к имени файла справа от «>». Символ «>» указывает оболочке перенаправить весь вывод туда, куда вы укажете (в данном случае — в diff-файл). Если нужно применить изменения к другой копии «оригинала» (на другом компьютере, например), то надо выполнить одну из двух команд в директории, которая содержит нужный файл:

patch -p1 < /путь/к/diff-файлу

patch -Np1 -i /путь/к/diff-файлу

Разумеется, «/путь/к/diff-файлу» следует заменить на реальный путь к файлу.

Я, конечно, понимаю, что мой пример недостаточно убедителен, чтобы вы решили использовать diff, но я выбрал его для простоты. А вот ещё один случай, где может пригодиться diff: допустим, у вас два файла (в моём случае это обычно файлы конфигурации), и вы хотите узнать, чем они отличаются. Для этого достаточно выполнить команду:

diff /путь/к/первому/файлу /путь/ко/второму/файлу

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

5c5
< - Описать полезные вещи, которые можно сделать с помощью curl, wget и прочего? А diff?
---
> - Diff (wget и curl в следующем месяце).

Сейчас я объясню всё это по порядку. «5c5» — это (как я полагаю) сравнение строчек в первом и втором файлах. Я в этом не уверен, но, кажется, так оно и есть. Дальше отображена удалённая строчка («<» означает «удалено»), а под ней — что было добавлено (таким образом, получилась замена оригинальной строки), на что указывает символ «>».

Как видите, это очень даже полезный инструмент для того, чтобы обнаружить различия между двумя файлами, особенно если они большие. Для удобства можно «обернуть» вывод утилитами more или less или перенаправить его в текстовый файл. Формат будет прежним, если не менять опции команды diff.

Надеюсь, это ознакомление с diff помогло вам представить подходящий случай для его применения. Также надеюсь, что diff упростит жизнь любому, кто решил его использовать. Как всегда, любые вопросы или комментарии можно присылать мне на lswest34@gmail.com. Не забудьте добавить «C&C» или «FCM» к теме письма — в таком случае я быстро вам отвечу (это также поможет мне с лёгкостью упорядочить мою почту!).