Почему заголовки разделов man-страниц не являются полностью отображаемыми?

14

Это было проверено в Эль-Капитане и в Высшей Сьерре коллеги, в стандартном Терминале (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'').

Для пояснения: «ОШИБКИ» - это заголовок раздела в этих (и других различных) страницах. Для заголовков разделов grepping работает только для первых 2 символов; это согласуется с несколькими заголовками разделов, которые мы пробовали. Для остальной части контента, grepкажется, работает как ожидалось.

Я запустил ssh'd в Linux-боксе без вкуса BSD (Amazon Linux), и он, похоже, не демонстрирует такого же поведения.

Что тут происходит?

Джонатан Мерклин
источник
Это одна из причин, почему я ненавижу человека BSD. Он форматирует текст и запускает пейджер, даже если его выводом является труба. И мой пейджер vim, поэтому Линус запретил, я когда-либо делал man foo | grep bar, я получаю не отвечающий конвейер (и, возможно, испорченный терминал для загрузки). : / mandb man , который вы обычно видите в Linux, более разумен.
Муру
unix.stackexchange.com/questions/371062 также является вопросом MacOS.
JdeBP

Ответы:

15

Вы можете видеть, что происходит, если вы просматриваете необработанные коды на странице руководства. Один из способов сделать это - экспортировать справочную страницу в файл и напрямую проверить ее содержимое:

man ls > man.ls
nano man.ls

Слово «ОШИБКИ» на самом деле выглядит так в файле:

B^HBU^HUG^HGS^HS

Вы увидите, что заголовки содержат символы форматирования, поэтому полное слово «BUGS» отсутствует.


Если вы хотите получить доступ к текстовому содержимому страницы руководства, вы можете использовать команду

man -P cat <thepage>

-PОпция устанавливает пейджер на другом UNIX и catбудет игнорировать информацию о форматировании, давая выход открытого текста. Однако это не похоже на работу в macOS, поэтому вывод требует ручного col -bшага в конвейере:

man ls | col -b | grep BUGS
п`одать
источник
2
Спасибо Скот! Перенаправление в файл и открытие в текстовом редакторе должно было быть первым, что я попробовал. Используя эту информацию и информацию с unix.stackexchange.com/a/15866 (т.е. man ls | col -b | grep "BUGS"), я смог получить то, что хотел.
Джонатан Мерклин
7
Боже мой, жирный шрифт - это старая эра TTY и пишущих машинок, набери букву и пробел и набери букву еще раз, зная, что они не выстроятся в линию идеально и будут вносить больше чернил. Должна быть nroffкоманда, чтобы перевести это, если вам нужно grep - не возражаете, если бы я расширил это, как передать правильную команду groffчерез via man?
Bmike
@Kroltan +10 и +10 к шотландцам. Это намного элегантнее, чем то, что я не думал о снятии шкуры с этой конкретной кошки.
bmike
@Kroltan Хммм - у меня man -P cat ls | grep BUGSработает идентично man ls | grep BUGS, оба ничего не возвращают.
шотландец
1
Для ручных систем, которые используют GNU roff, действительно есть опции, grottyкоторые не позволят ему испускать управляющие последовательности TTY-37 или ECMA48.
JdeBP