Jeśli dodasz | sed -n ldo tego tailpolecenia, aby wyświetlać znaki niedrukowalne, prawdopodobnie zobaczysz coś takiego:
N\bNA\bAM\bME\bE
Oznacza to, że każdy znak jest pisany jako XBackspace X. Na nowoczesnych terminalach znak kończy się nad sobą (ponieważ Backspace aka BS aka \baka ^Hto znak, który przesuwa kursor o jedną kolumnę w lewo) bez różnicy. Ale w starożytnych maszynach do pisania to sprawiałoby, że postać pojawiała się pogrubioną czcionką, ponieważ otrzymywała dwa razy więcej atramentu.
Mimo to, pagery takie jak more/ lessdo rozumieją ten format jako pogrubiony, więc nadal to roffrobi, aby uzyskać pogrubiony tekst.
Niektóre implementacje man wywoływałyby roffw taki sposób, że te sekwencje nie byłyby używane (lub byłyby wywoływane wewnętrznie, col -b -p -xaby je rozebrać, tak jak w przypadku man-dbimplementacji (chyba że MAN_KEEP_FORMATTINGustawiono zmienną środowiskową)) i nie wywoływały pagera po wykryciu wyniku nie jedzie do terminalu (więc man bash | grep NAMEby tam działał), ale nie twój.
Możesz użyć col -bdo usunięcia tych sekwencji (istnieją również inne typy ( _BS X) również dla podkreślenia).
W przypadku systemów korzystających z GNU roff(takich jak GNU lub FreeBSD) możesz uniknąć używania tych sekwencji, upewniając się, że -c -b -uopcje zostały przekazane grotty, na przykład upewniając się, że -P-cbuopcje zostały przekazane groff.
Na przykład poprzez utworzenie skryptu opakowania o nazwie groffzawierającego:
#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"
Które umieściłeś przed / usr / bin / groff $PATH.
W systemie macOS ' man(również używającym GNU roff) możesz utworzyć man-no-overstrike.conf:
NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu
I zadzwoń manjako:
man -C man-no-overstrike.conf bash | grep NAME
Nadal w GNU roff, jeśli ustawisz GROFF_SGRzmienną środowiskową (lub nie ustawisz GROFF_NO_SGRzmiennej w zależności od tego, jak domyślne zostały ustawione w czasie kompilacji), wtedy grotty(o ile nie zostanie przekazana -copcja) użyje zamiast tego sekwencji ucieczki terminala ANSI SGR tych sztuczek BS dla atrybutów postaci. lesszrozumieć je, gdy zostanie wywołany z -Ropcją.
Man wywołuje FreeBSD grottyz tą -copcją, chyba że pytasz o kolory , ustawiając zmienną MANCOLOR (w którym -cto przypadku nie jest przekazywany grottyi grottypowraca do domyślnego użycia sekwencji specjalnych ANSI SGR).
MANCOLOR=1 man bash | grep NAME
będzie tam działać.
W Debianie GROFF_SGR nie jest domyślny. Jeśli zrobisz:
GROFF_SGR=1 man bash | grep NAME
jednak ponieważ standardowe manwyjście nie jest terminalem, na siebie spoczywa również obowiązek przekazania GROFF_NO_SGRzmiennej do grotty(przypuszczam, że może on użyć col -bpxdo rozebrania sekwencji BS, ponieważ colnie wie, jak rozebrać sekwencje SGR, mimo że nadal robi to z MAN_KEEP_FORMATTING), co zastępuje nasze GROFF_SGR. Możesz zamiast tego:
GROFF_SGR=1 MANPAGER='grep NAME' man bash
(w terminalu), aby mieć sekwencje specjalne SGR.
Tym razem zauważysz, że niektóre z tych NAZW są pogrubione na terminalu (i na less -Rpagerze). Jeśli podasz wynik do sed -n l( MANPAGER='sed -n /NAME/l'), zobaczysz coś takiego:
\033[1mNAME\033[0m$
Gdzie \e[1mjest sekwencja, aby włączyć pogrubienie w terminalach kompatybilnych z ANSI, a \e[0msekwencja, aby przywrócić wszystkie atrybuty SGR do wartości domyślnej.
Ten tekst grep NAMEdziała tak, jak on zawiera tekst NAME, ale nadal możesz mieć problemy, jeśli szukasz tekstu, w którym tylko jego części są pogrubione / podkreślone ...