Se você adicionar um | sed -n l
a esse tail
comando, para mostrar caracteres não imprimíveis, provavelmente verá algo como:
N\bNA\bAM\bME\bE
Ou seja, cada caractere é escrito como X
Backspace X
. Nos terminais modernos, o caractere acaba sendo escrito sobre si mesmo (como Backspace aka BS aka \b
aka ^H
é o caractere que move o cursor uma coluna para a esquerda) sem diferença. Mas nas tele-máquinas de escrever antigas, isso faria com que o personagem aparecesse em negrito, pois recebe duas vezes mais tinta.
Ainda assim, os pagers gostam more
/ less
entendem esse formato como negrito, e ainda é o que roff
faz com a saída de texto em negrito.
Algumas implementações humanas chamariam de roff
maneira que essas seqüências não sejam usadas (ou chamarão internamente col -b -p -x
para removê-las como no caso da man-db
implementação (a menos que a MAN_KEEP_FORMATTING
variável de ambiente esteja definida)) e não invoquem um pager quando detectarem a saída não está indo para um terminal (por man bash | grep NAME
isso funcionaria lá), mas não o seu.
Você pode usar col -b
para remover essas seqüências (existem outros tipos ( _
BS X
) e também sublinhados).
Para sistemas que usam GNU roff
(como GNU ou FreeBSD), você pode evitar que essas sequências sejam usadas em primeiro lugar, certificando-se de que as -c -b -u
opções sejam passadas grotty
, por exemplo, certificando-se de que as -P-cbu
opções sejam passadas groff
.
Por exemplo, criando um script de wrapper chamado groff
contendo:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Que você coloca à frente de / usr / bin / groff $PATH
.
Com o macOS ' man
(também usando o GNU roff
), você pode criar um man-no-overstrike.conf
com:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
E ligue man
como:
man -C man-no-overstrike.conf bash | grep NAME
Ainda com o GNU roff
, se você definir a GROFF_SGR
variável de ambiente (ou não a GROFF_NO_SGR
variável, dependendo de como os padrões foram definidos no tempo de compilação), então grotty
(contanto que não seja aprovada a -c
opção) usará as seqüências de escape do terminal ANSI SGR desses truques de BS para atributos de caracteres. less
entendê-los quando chamados com a -R
opção
O homem do FreeBSD chama grotty
com a -c
opção, a menos que você esteja solicitando cores , configurando a variável MANCOLOR (nesse caso, -c
não é passada para grotty
e grotty
volta ao padrão de usar as seqüências de escape ANSI SGR).
MANCOLOR=1 man bash | grep NAME
vai trabalhar lá.
No Debian, GROFF_SGR não é o padrão. Se você fizer:
GROFF_SGR=1 man bash | grep NAME
no entanto, como man
o stdout não é um terminal, também é possível passar uma GROFF_NO_SGR
variável para grotty
(suponho que ele possa ser usado col -bpx
para extrair as seqüências BS, pois col
não sabe como extrair as seqüências SGR, mesmo que ainda faz isso com MAN_KEEP_FORMATTING
) que substitui o nosso GROFF_SGR
. Você pode fazer:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(em um terminal) para ter as seqüências de escape do SGR.
Nesse momento, você notará que alguns desses NOME s aparecem em negrito no terminal (e em um less -R
pager). Se você alimentar a saída para sed -n l
( MANPAGER='sed -n /NAME/l'
), verá algo como:
\033[1mNAME\033[0m$
Onde \e[1m
está a sequência para ativar negrito nos terminais compatíveis com ANSI e \e[0m
a sequência para reverter todos os atributos SGR para o padrão.
Nesse texto grep NAME
funciona como o texto contém NAME
, mas você ainda pode ter problemas se procurar texto em que apenas partes dele estejam em negrito / sublinhado ...