Зробив `man ls> temp.txt`. Вихідний текстовий файл пошкоджений

When I execute man ls > temp.txt the output text file is corrupted. By corrupted I mean that first and last letters in some words are overly repeated.

Кілька перших рядків у temp.txt :

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

NNAAMMEE
     llss -- list directory contents

SSYYNNOOPPSSIISS
     llss [[email protected]@aabbccddeeffgghhiikkllmmnnooppqqrrssttuuwwxx11] [_f_i_l_e _._._.]

DDEESSCCRRIIPPTTIIOONN

І так далі. Без перенаправлення man ls цілком нормально. Що відбувається?

26
Цікаво, що перегляд файлу за допомогою less або more відображає правильне форматування. Якщо ви використовуєте vim , воно буде показувати необроблені пропуски ( ^ H ) з додатковими літерами.
додано Автор Lori, джерело
Цікаво, що команда man на моєму комп'ютері з Linux не працює так, коли вивід перенаправляється.
додано Автор user010010001, джерело
Ваші файли страждають від гикавки.
додано Автор user137301, джерело

5 Відповіді

З man man :

To get a plain text version of a man page, without backspaces and underscores, try

    # man foo | col -b > foo.mantxt

man prints formatted version of man page, underscores and double letters are parsed

Це не стільки, що вони "розібрані", а "якщо у вас немає терміналу, то жирний формат повинен відображатися як повторюваний символ". Після підключення до терміналу (vt100, xterm, Terminal, etc ...), людина розпізнає термінал і надсилає відповідні контрольні коди, щоб виконати колір, жирний шрифт, підкреслення тощо. Його правильно проаналізуємо - тільки для нульового типу терміналу.

коментар від MichaelT

30
додано

Давним-давно комп'ютери зазвичай підключалися до телетайпів (телепристроїв), які надрукували весь текст на папері в режимі реального часу, як він був отриманий. Хоча teleprinters не мали жодних можливостей для підкресленого або напівжирного тексту, виведення підкреслення, зворотний проміжок і друк чогось іншого призвело б до того, що ще щось буде підкреслено. Подібним чином, виведення символу, зворотний простір і виведення одного і того ж символу призводять до того, що символ буде виглядати темнішим, хоча ефективність може змінюватись залежно від якості встановленої стрічки (якщо стрічка була старою і слабкою, двічі вводячи один і той же символ зробить його значно темнішим, з новою стрічкою, що набирає символ, навіть один раз досягає максимальної чорноти). Крім того, навіть якщо користувач не був приєднаний до принтера, перенаправлення виводу man на диспетчер спулера друку було б досить поширеним, що, ймовірно, пояснює, чому б поводився man таким чином, навіть коли вихід був перенаправлений.

До речі, на деяких принтерах (і навіть телепринтерах) продуктивність _ ← U_ ← N_ ← D_ ← E_ ← R_ ← L_ ← I_ ← N_ ← I_ ← N_ ← G буде помітно гірше, ніж < код> ___________ ← ПОЛЯ2А2А2А2А2АВЕРАДАННЯ , оскільки перший вимагає, щоб друкуюча головка повторно перевертала напрямок (і, як правило, перевищувала свою мету на обох кінцях). Те ж саме можна було б сказати і при використанні багаторазового жирного шрифту, але в такому випадку поведінка може бути вигідною, оскільки перший раз, коли кожен символ буде надруковано, буде негайно слідувати символу зворотного ходу, а другий не буде. Якщо друкуюча головка прискорюється під час друку першого символу, це призведе до незначного поєднання його друку з другим символом.

21
додано
Акуратний урок історії! Чудово бачити, чому певні методи можуть бути кращими за інші.
додано Автор AndreaPaco, джерело
Чим більше я дізнаюся про Unix, тим більше я знаходжу, як його обтяжує зворотна сумісність, як і Windows.
додано Автор Siyuan Ren, джерело

Відповідь Матеуша правильна, але варто відзначити, що замість того, щоб відмовитися від форматування, призначеного для tty, ви можете мати формат людини по-різному.

Наприклад, ви можете отримати добре форматований PDF, а не:

man -t ls | pstopdf -i -o ~/ls.pdf
15
додано
Це круто. Дякую.
додано Автор Martin Buberl, джерело
Приємна особливість. Чи є простий спосіб виведення html, крім цього? gzip -dc $ (man -w ls) | groff -Thtml -mandoc -c> /tmp/man-ls.html
додано Автор Lori, джерело
Я використовую OnyX протягом багатьох років, головним чином, для того, щоб мої сторінки сторінок друкувалися так, як це робиться. Не більше! Я напишу це у скрипт, який буде робити всі сторінки на моїй системі. Велике спасибі за це, тому що я давно відмовився від того, чому я використовую OnyX. Я віддаю перевагу робити це з терміналу, і тепер я можу.
додано Автор user3439894, джерело
У manpage для man написано, що -t форматів з groff -Tps ... і з запущених рядків на/usr/bin/man, це, мабуть, жорстке. А оскільки -Tps перевизначає GROFF_TYPESETTER, ваше рішення може бути найбільш життєздатним. Хоча вам не вистачає кроку у вашому конвеєрі. Ви хочете tbl, а потім groff. Спробуйте man -d ls побачити конвеєр, який він використовує.
додано Автор user26870, джерело

Як альтернатива, я визначив наступну функцію оболонки (викликається з Oh-my-ZSH плагін OS X):

man-preview() {
    man -t "[email protected]" | open -f -a /Applications/Preview.app
}

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

P.S. Я бачив функцію pman , визначену в різних точкових файлах по всьому Інтернету.

5
додано

Або ви можете використовувати ManOpen від Карла Ліндберга для пошуку і друку будь-якої сторінки. ManOpen вперше розроблений для NeXtStep і все ще працює завдяки Карлу.

2
додано