Сделал `man ls> temp.txt`. Выходной текстовый файл поврежден

27

Когда я выполняю man ls > temp.txtвыходной текстовый файл поврежден. Под искаженным я подразумеваю, что первые и последние буквы в некоторых словах чрезмерно повторяются.

Несколько первых строк в temp.txt:

LS(1)                     BSD General Commands Manual                    LS(1)

NNAAMMEE
     llss -- list directory contents

SSYYNNOOPPSSIISS
     llss [--AABBCCFFGGHHLLOOPPRRSSTTUUWW@@aabbccddeeffgghhiikkllmmnnooppqqrrssttuuwwxx11] [_f_i_l_e _._._.]

DDEESSCCRRIIPPTTIIOONN

И так далее. Без перенаправления man lsэто совершенно нормально. Что творится?

seeker_of_bacon
источник
Интересно, что при просмотре файла используется форматирование lessили moreотображается правильно. Если вы используете vim, он покажет необработанные backspaces ( ^H) с дополнительными буквами.
Кельвин
2
Ваши файлы страдают от икоты.
Ктулху
Интересно, что команда man на моем компьютере с Linux не ведет себя так, когда вывод перенаправляется.
Дэвид Бейли

Ответы:

30

От man man:

Чтобы получить простую текстовую версию справочной страницы без пробелов и подчеркиваний, попробуйте

    # man foo | col -b > foo.mantxt

manпечатает отформатированную версию справочной страницы, подчеркивания и двойные буквы анализируются

Дело не в том, что они «анализируются», а, скорее, «если у вас нет терминала, жирный формат должен отображаться как повторяющийся символ». Как только вы подключите его к терминалу (vt100, xterm, Terminal и т. Д.), Человек распознает терминал и отправит соответствующие управляющие коды, чтобы сделать цвет, жирный, подчеркивание и тому подобное. Он анализируется правильно - только для терминала нулевого типа.

комментарий MichaelT

Матеуш Шлосек
источник
21

Когда-то компьютеры регулярно подключались к телетайпам (телепринтерам), которые печатали весь текст на бумаге в режиме реального времени по мере его поступления. Несмотря на то, что у телепринтеров не было никаких средств для подчеркнутого или выделенного жирным шрифтом текста, вывод подчеркивания, возврата на задний план и распечатка чего-либо другого может привести к тому, что что-то еще будет подчеркнуто. Аналогичным образом, при выводе символа, возврата на одну позицию и выводе одного и того же символа персонаж будет выглядеть темнее, хотя эффективность этого будет зависеть от качества установленной ленты (если лента старая и слабая, дважды введите один и тот же символ). сделало бы его значительно темнее; с помощью новой ленты, напечатанной на персонаже, даже один раз можно было бы достичь максимальной черноты). Кроме того, даже если пользователь не был подключен к принтеру,manдля диспетчера очереди печати было бы довольно распространенным явлением, что, вероятно, объясняет, почему manбы так себя вести, даже если вывод был перенаправлен.

Кстати, на некоторых принтерах (и даже на телепринтерах) производительность _←U_←N_←D_←E_←R_←L_←I_←N_←I_←N_←Gбудет заметно хуже ___________←←←←←←←←←←←UNDERLINING, поскольку для первого требуется, чтобы печатающая головка многократно изменяла направление (и обычно выходила за пределы цели на обоих концах). То же самое можно сказать и при использовании полужирного жирного шрифта, но в этом случае поведение на самом деле может быть выгодным, поскольку первый раз, когда каждый символ печатается, сразу следует за символом возврата, а второй - нет. Если бы печатающая головка ускорялась при печати первого символа, это привело бы к небольшому смещению относительно второго, делая эффект полужирного лица более эффективным.

Supercat
источник
Чем больше я узнаю о Unix, тем больше я нахожу, как он обременен обратной совместимостью, как и Windows.
Сиюань Рен
Аккуратный урок истории! Приятно видеть, почему одни методы могут быть предпочтительнее других.
Дастин Уилер
15

Ответ Матеуша верен, но стоит отметить, что вместо удаления форматирования, предназначенного для tty, вы можете использовать формат man по-другому.

Например, вы можете получить красиво отформатированный PDF вместо:

man -t ls | pstopdf -i -o ~/ls.pdf
Тим Б
источник
Я использую OnyX в течение многих лет, главным образом, чтобы печатать мои страницы руководства, как это делает. Больше не надо! Я напишу это в сценарии, который будет выполнять все man-страницы в моей системе. Большое спасибо за это, потому что я давно перестал искать, почему я использую OnyX. Я предпочитаю делать такие вещи из терминала, и теперь я могу.
user3439894
Хорошая особенность. Есть ли простой способ вывода html помимо этого? gzip -dc $(man -w ls) | groff -Thtml -mandoc -c > /tmp/man-ls.html
Кельвин
На man-странице для man говорится, что -tформатирование groff -Tps ...выполняется с / из строк в / usr / bin / man, что, по-видимому, жестко закодировано. И так как -Tpsпереопределяет GROFF_TYPESETTER, ваше решение может быть наиболее жизнеспособным. Хотя вы упускаете шаг в своем конвейере. Тебе нужен тбл, тогда грифф. Попробуйте man -d lsувидеть конвейер, который он использует.
Тим Б
6

В качестве альтернативы у меня определена следующая функция оболочки ( вызывается из плагина OS- Oh Oh-my-ZSH ):

man-preview () {
    man -t "$@" | open -f -a /Applications/Preview.app
}

Это приводит к тому, что нужная справочная страница открывается в Preview с полным форматированием, которое только можно пожелать. Достаточно просто добавить этот единственный псевдоним к вашему ~/.profile(я думаю, что pmanпроще man-preview, поэтому я установил alias pman='man-previewв своем ~/.zshrc).

PS Я видел pmanфункцию, определенную в различных точечных файлах по всему Интернету, Oh-my-ZSH как раз там, где определена моя.

Дастин Уилер
источник
2

Или вы можете использовать ManOpen Карла Линдберга, чтобы найти и распечатать любую страницу руководства. ManOpen был впервые разработан для NeXtStep и до сих пор работает благодаря Карлу.

Sunwolf
источник