April 22, 2016

One day one manpage / Un jour une manpage : lesspipe

English version here
Le concept de "un jour une manpage" est simple : je choisis une manpage aléatoirement et j’explore la commande associée.

Aujourd’hui, c’est la commande lesspipe qui sera passée à la loupe. Tout d’abord, regardons ce que raconte un man lesspipe :

lessfile, lesspipe - "input preprocessor" for less. lessfile and lesspipe are programs that can be used to modify the way the contents of a file are displayed in less

Cette commande permet donc de manipuler le contenu d’un fichier avant de l’envoyer à less. Pourquoi faire ? Essayez de lancer less sur une image, un .deb ou un .tar.gz…​ Vous aurez quelques soucis. Lesspipe permet donc (entre autre) d’enrichir less pour explorer de nouveaux types de fichier.

Pour l’activer, il suffit de lancer (ou de rajouter dans son .bashrc ou équivalent) :

eval "$(lesspipe)"

Comment ça marche ?

Lançons juste lesspipe dans un terminal. On obtient :

export LESSOPEN="| /usr/bin/lesspipe %s";
export LESSCLOSE="/usr/bin/lesspipe %s %s";

Deux variables sont donc définies: LESSOPEN et LESSCLOSE.

La man page de less indique, dans la partie INPUT PREPROCESSOR, que la variable LESSOPEN sert à activer un préprocesseur pour less. Ce préprocesseur reçoit en paramètre le nom du fichier envoyé à less, crée un fichier temporaire et renvoie en sortie le nom de ce fichier temporaire. Le nom du fichier temporaire sera ensuite utilisé par less.

Le préprocesseur peut également envoyer directement à less des informations sans créer de fichiers temporaires. Dans ce cas là, tout ce qui sera envoyé sur la sortie standard du script appelé par LESSOPEN sera transmis à less. La man page de less indique à ce sujet:

It is also possible to set up an input preprocessor to pipe the file data directly to less, rather than putting the data into a replacement file.

[…​] To use an input pipe, make the first character in the LESSOPEN environment variable a vertical bar (|) to signify that the input pre-processor is an input pipe.

On remarque que lesspipe ne créera pas de fichiers temporaires (le script commence par un |).

Dans notre cas, quand less sera appelée, le script /usr/bin/lesspipe sera appelé avec comme paramètre le nom du fichier sur lequel less est appelé. Essayons d’appeler /usr/bin/lesspipe manuellement, par exemple sur une image :

$ lesspipe myimage.png
myimage.png PNG 254x29 1920x1080+12+134 8-bit sRGB 3.69KB 0.000u 0:00.000

On voit que lesspipe retourne certaines informations sur l’image. Ces informations seront passées à less et affichées.

Pour LESSCLOSE, voici une partie intéressante de la man page de less :

When less closes a file opened in such a way, it will call another program, called the input postprocessor, which may perform any desired clean-up action.

LESSCLOSE sert donc à faire le nettoyage. Le script référencé par LESSCLOSE reçoit deux paramètres : le nom du fichier original (sur lequel on a appelé less), et le nom du fichier temporaire (généré par le script LESSOPEN).

On peut maintenant utiliser less sur de nombreux types de fichiers. Par exemple, less sur un .zip affichera les fichiers contenus dans cette archive. Même chose pour de nombreux autres formats comme tar, deb, rpm, iso, pdf…​ Et même des images !

source-highlight

Dans le même genre, source-highlight permet de rajouter de la coloration syntaxique à less. Pour l’installer (sur Debian), c’est simple :

sudo apt-get install source-highlight

On se retrouve ensuite avec un script dans /usr/share/source-highlight/src-hilite-lesspipe.sh

De la même façon que pour lesspipe, utilisons ce script comme préprocesseur :

export LESSOPEN="| /usr/share/source-highlight/src-hilite-lesspipe.sh %s"

less -R [votre fichier] vous ouvrira le fichier avec la coloration syntaxique.

En conclusion, grâce aux deux variables d’environnements (LESSOPEN and LESSCLOSE) vues précédemment, vous pouvez même facilement écrire vos propres scripts pour enrichir less.

Tags: devops

Add a comment








If you have a bug/issue with the commenting system, please send me an email (my email is in the "About" section).

Top of page