diff un peu plus lisible

closeCet article a été publié il y a 7 ans 3 mois 4 jours, il est donc possible qu’il ne soit plus à jour. Les informations proposées sont donc peut-être expirées.

Vous avez peut-être déjà utilisé diff pour comparer le contenu de deux fichiers pour en connaître les différences. Mais il faut avouer que par défaut, l’affichage des résultats est assez peu lisible, un peu à l’image d’un dmesg. Fort heureusement, il est possible de lui demander d’être beaucoup plus « humain » dans ses réponses, voyons voir ce qu’il est possible de faire.

Rappel : comment ça marche par défaut

Lors de mon exemple d’utilisation de telegraf les yeux avisés auront remarqué que les scripts sont très proches. Voilà le résultat de diff par défaut :

J’avais prévenu, c’est dégueulasse, et encore l’exemple est assez simple ici. Donc on va chercher à améliorer tout ça.

Afficher le contexte

Le contexte, c’est afficher la ligne d’avant et la ligne d’après une modification pour bien expliquer ce qui a été modifié. Deux façons de s’y prendre, contexte copié, et contexte unifié. La différence entre les deux ? Le premier vous affiche chaque ligne modifié avec la ligne d’avant et la ligne d’après, le deuxième n’affiche qu’une seule fois ces lignes et regroupe les modifications entre celles-ci. Un exemple vaut mieux qu’un long discours, voyons donc respectivement ce qu’ils valent :

A noter que j’ai fait les tests sur deux machines différentes, l’une ma Manjaro, avec diff 3.5, l’autre le Raspberry Pi, avec Debian 8,  et donc diff 3.3. Sur la plus récente, j’ai la possibilité supplémentaire de faire un --color pour afficher les différences avec des couleurs, un peu comme ici avec la coloraiton syntaxique, mais avec les – en rouge, et les + en vert (pratique quand on compare deux versions successives d’un fichier).

Et si on affichait sur deux colonnes ?

Attention, je recommande d’avoir un écran un peu large, encore qu’il semble tronquer par défaut (ceci dit ça permet de cibler les lignes différentes tout de même) :

Vous aurez remarqué qu’il affiche systématiquement le contexte. Si vous voulez vous en passer, vous pouvez ajoute l’option --suppress-common-lines :

Moins chargé, mais moins précis également.

Et s’il n’y a pas de différence ?

Par défaut, ça ne dit rien (et ça renvoie un code de retour 0). Ca peut suffire pour des tests, notamment dans des scripts, mais d’un point de vue humain, c’est frustrant, un peu comme avec systemctl qui ne vous dit quelque chose que s’il y a un problème. Alors rendons-le un peu plus bavard :

C’est plus sympa comme ça non ?

Et en mode « graphique » ?

Carrément. Bon là c’est pas diff qui est mis à contribution, mais vim, avec la commande vimdiff, et là, une capture d’écran s’impose :

C’est le mode que je préfère, le plus clair.

Vos IDE à la rescousse

J’ai présenté diff parce qu’on l’utilise souvent quand on est directement connecté à un serveur. Mais évidemment, les environnement de développement, les éditeurs de code, ainsi que les éditeurs de textes avancés proposent pratiquement tous, de manière native ou sous forme de plugin, une option de comparaison entre fichiers. Le plugin ‘compare’ de notepad++ par exemple ressemble fortement à vimdiff. A noter que git aussi embarque une option diff pour vérifier l’évolution d’un fichier entre la version courante et le dernier commit.

Bref, vous avez maintenant les moyens d’utiliser plus efficacement une commande diablement pratique, alors abusez-en 🙂

PS : juste avant la parution de cet article, le site HowToForge (que je recommande vivement) a publié la présentation d’un outil graphique appelé Meld qui permet de faire le travail dans une GUI pratique à utiliser.

2 Commentaires
Le plus ancien
Le plus récent
Commentaires en ligne
Afficher tous les commentaires
Joel Tarlao
Joel Tarlao
22/01/2017 22:59

Excellent article, merci beaucoup.
Je ne connaissait pas toutes ces possibilités…

guuuguu
guuuguu
17/02/2017 15:01

À noter l’outil « meld » graphique qui est très bon pour afficher les diffs (voir les captures d’écran) http://meldmerge.org/
Il peut aussi comparer un dossier entier, et comparer 3 fichiers côte-à-côte.