Si vous ajoutez un | sed -n là cette tailcommande, pour afficher des caractères non imprimables, vous verrez probablement quelque chose comme:
N\bNA\bAM\bME\bE
Autrement dit, chaque caractère est écrit comme XBackspace X. Sur les terminaux modernes, le personnage finit par être écrit sur lui-même (comme Backspace aka BS aka \baka ^Hest le personnage qui déplace le curseur d'une colonne vers la gauche) sans différence. Mais dans les anciennes machines à écrire, cela ferait apparaître le caractère en gras car il obtient deux fois plus d'encre.
Pourtant, les pagers aiment more/ lesscomprennent ce format comme signifiant gras, c'est donc ce qui rofffait pour produire du texte en gras.
Certaines implémentations man appellent roffde manière à ce que ces séquences ne soient pas utilisées (ou appellent en interne col -b -p -xpour les supprimer comme dans le cas de l' man-dbimplémentation (à moins que la MAN_KEEP_FORMATTINGvariable d'environnement ne soit définie)), et n'invoquent pas de pager lorsqu'elles détectent la sortie ne va pas à un terminal (donc man bash | grep NAMEfonctionnerait là-bas), mais pas le vôtre.
Vous pouvez utiliser col -bpour supprimer ces séquences (il existe également d'autres types ( _BS X) pour souligner).
Pour les systèmes utilisant GNU roff(comme GNU ou FreeBSD), vous pouvez éviter que ces séquences soient utilisées en premier lieu en vous assurant que les -c -b -uoptions sont passées à grotty, par exemple en vous assurant que les -P-cbuoptions sont passées à groff.
Par exemple en créant un script wrapper appelé groffcontenant:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Que vous placez devant / usr / bin / groff $PATH.
Avec macOS ' man(utilisant également GNU roff), vous pouvez créer un man-no-overstrike.confavec:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
Et appelez mancomme:
man -C man-no-overstrike.conf bash | grep NAME
Toujours avec GNU roff, si vous définissez la GROFF_SGRvariable d'environnement (ou si vous ne définissez pas la GROFF_NO_SGRvariable en fonction de la façon dont les valeurs par défaut ont été définies au moment de la compilation), alors grotty(tant qu'elle n'est pas transmise, l' -coption) utilisera des séquences d'échappement du terminal ANSI SGR à la place. de ces astuces BS pour les attributs de personnage. lessles comprendre lorsqu'ils sont appelés avec l' -Roption.
L'homme de FreeBSD appelle grottyavec l' -coption à moins que vous ne demandiez des couleurs en définissant la variable MANCOLOR (auquel cas il -cn'est pas passé à grottyet grottyrevient à la valeur par défaut de l'utilisation des séquences d'échappement ANSI SGR là-bas).
MANCOLOR=1 man bash | grep NAME
fonctionnera là-bas.
Sur Debian, GROFF_SGR n'est pas la valeur par défaut. Si tu fais:
GROFF_SGR=1 man bash | grep NAME
cependant, parce que manstdout n'est pas un terminal, il prend sur lui de passer également une GROFF_NO_SGRvariable à grotty(je suppose donc qu'il peut utiliser col -bpxpour supprimer les séquences BS car colil ne sait pas comment supprimer les séquences SGR, même s'il reste le fait avec MAN_KEEP_FORMATTING) qui l'emporte sur notre GROFF_SGR. Vous pouvez faire à la place:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(dans un terminal) pour avoir les séquences d'échappement SGR.
Cette fois, vous remarquerez que certains de ces NOM apparaissent en gras sur le terminal (et dans un less -Rpager). Si vous alimentez la sortie en sed -n l( MANPAGER='sed -n /NAME/l'), vous verrez quelque chose comme:
\033[1mNAME\033[0m$
Où \e[1mest la séquence pour activer le gras dans les terminaux compatibles ANSI, et \e[0mla séquence pour rétablir tous les attributs SGR par défaut.
Sur ce texte grep NAMEfonctionne comme ce texte contient NAME, mais vous pouvez toujours avoir des problèmes si vous recherchez du texte dont seules certaines parties sont en gras / souligné ...