Dlaczego tytuły sekcji stron podręcznika nie są w pełni czytelne?

14

Zostało to przetestowane w El Capitan i w High Sierra kolegi, w standardowym terminalu (bash).

user@hostname ~ $ man ls | grep "BU"
BUGS
user@hostname ~ $ man ls | grep "BUG"
user@hostname ~ $ 
user@hostname ~ $ man ls | grep "IEEE"
     files in order to be compatible with the IEEE Std 1003.2 (``POSIX.2'')
     The ls utility conforms to IEEE Std 1003.1-2001 (``POSIX.1'').

Aby wyjaśnić: „BŁĘDY” to tytuł sekcji na tej (i różnych innych) stronach podręcznika. W przypadku tytułów sekcji grepping wydaje się działać tylko dla pierwszych 2 znaków; jest to spójne w kilku różnych tytułach sekcji, które wypróbowaliśmy. Reszta treści grepwydaje się działać zgodnie z oczekiwaniami.

Ssh'owałem do Linux-a o smaku innym niż BSD (Amazon Linux) i wygląda na to, że nie zachowuje się tak samo.

Co tu się dzieje?

Jonathan Merklin
źródło
Jest to jeden z powodów, dla których nienawidzę człowieka z BSD. Formatuje tekst i uruchamia pager, nawet jeśli jego wyjściem jest potok. A mój pager to vim, więc Linus zabrania, żebym kiedykolwiek tak robił man foo | grep bar, dostaję nieodpowiadający potok (i może zepsuty terminal do uruchomienia). : / mandb man , który zwykle widzi się w Linuksie, jest bardziej rozsądny.
muru
unix.stackexchange.com/questions/371062 to także pytanie MacOS.
JdeBP

Odpowiedzi:

15

Możesz zobaczyć, co się dzieje, jeśli przeglądasz nieprzetworzone kody na stronie podręcznika. Jednym ze sposobów jest wyeksportowanie strony man do pliku i bezpośrednie sprawdzenie jej zawartości:

man ls > man.ls
nano man.ls

Słowo „BŁĘDY” faktycznie wygląda tak w tym pliku:

B^HBU^HUG^HGS^HS

Zobaczysz, że nagłówki zawierają znaki formatujące, więc całe słowo „BŁĘDY” nie jest obecne.


Jeśli chcesz uzyskać dostęp do zawartości zwykłego tekstu strony podręcznika, możesz użyć polecenia

man -P cat <thepage>

-POpcja ustawia pager na inne UNIX i catbędzie ignorować informacje o formatowaniu, dając moc zwykłego tekstu. Nie wydaje się to jednak działać w systemie macOS, więc dane wyjściowe wymagają ręcznego col -bkroku w potoku:

man ls | col -b | grep BUGS
Szkot
źródło
2
Dzięki Scot! Przekierowanie do pliku i otwarcie w edytorze tekstu powinno być pierwszą próbą. Korzystając z tych informacji oraz informacji z unix.stackexchange.com/a/15866 (tj. man ls | col -b | grep "BUGS") Byłem w stanie uzyskać to, czego chciałem.
Jonathan Merklin
7
O Boże, śmiały, pogrubiona jest stara era TTY i maszyn do pisania, wpisz literę i cofnij, a następnie wpisz ponownie literę, wiedząc, że nie będą idealnie pasować i osadzą więcej atramentu. Musi istnieć nroffpolecenie do przetłumaczenia, jeśli trzeba grep - czy miałbyś coś przeciwko, gdybym rozszerzył to o to, jak przekazać poprawne polecenie groffprzez man?
bmike
@Kroltan +10 i +10 również do Scotta. Jest to o wiele bardziej eleganckie niż to, że nie myślałem o skórowaniu tego konkretnego kota.
bmike
@Kroltan Hmmm - dla mnie man -P cat ls | grep BUGSdziała identycznie man ls | grep BUGS, obie nic nie zwracają.
Scot
1
W przypadku systemów ręcznych, które wykorzystują GNU roff, istnieją rzeczywiście opcje grotty, które powstrzymają go przed emitowaniem sekwencji kontrolnych TTY-37 lub ECMA48.
JdeBP