Я бегу:

$ man cd > mancd
$ cat mancd

Это показывает, как и ожидалось. Но когда я открываю файл с помощью VSCode и vim, они совершенно разные.

enter image description here

enter image description here

Почему это так и как правильно перенаправить справочную страницу в файл.

5
Kusalananda 13 Мар 2021 в 11:11
6
Вывод man содержит трюки с форматированием, такие как выделение символов жирным шрифтом путем их печати, возврата и повторной печати (раньше это работало непосредственно на старых терминалах печати). Когда вы просматриваете вывод в редакторе, вы видите необработанные последовательности вместо их предполагаемого эффекта (как вы видите при обычном использовании man). Что касается хранения только простого текста, col -bx является обычным фильтром (см. этот ответ).
 – 
Gordon Davisson
13 Мар 2021 в 00:27
Этот комментарий станет довольно хорошим ответом
 – 
gronostaj
13 Мар 2021 в 18:28

1 ответ

Обратите внимание на множество ^H на снимке экрана выше. Это означает Ctrl+H, что дает символ ASCII 08 A.K.A. Возврат. При печати символа переместите курсор назад с помощью Backspace, затем замените тот же символ еще раз. затем он выглядит темнее. Вот как жирный текст получается в механической пишущей машинке. Различные современные электронные терминалы также поддерживают это, и многие инструменты CLI используют его для форматирования текста. Также часто используются последовательности ANSI, начинающиеся с Escape (ASCII 27). для изменения положения курсора и свойств форматирования текста, таких как мерцание, цвет, курсив... Эти символы 08 или 27 называются управляющие символы.

cat ничего не знает об этих байтах. Он просто передает необработанный поток байтов на терминал или на следующий элемент в конвейере. Поскольку терминал знает об этих управляющих символах, он правильно отобразит текст. Однако код vi или VS не является терминалом и переводит управляющие символы, прежде чем показывать их в своих окнах, чтобы случайные управляющие символы не испортили их экран и терминал.

Чтобы отключить управляющие символы и просто вывести обычный текст, проверьте параметры используемых вами инструментов. Для man обратите внимание на Controlling formatted output< /a> на странице руководства. Попробуйте что-нибудь вроде man --ascii cd

Однако большинство программ автоматически определяют тип вывода, чтобы знать, должны ли они выводить управляющие символы или нет, например, большинство инструментов GNU используют параметр --color, например ls или grep. Как и man:

  • MAN_KEEP_FORMATTING

    Обычно, когда вывод не направляется на терминал (например, в файл или канал), символы форматирования отбрасываются, чтобы облегчить чтение результата без специальных инструментов. Однако если для $MAN_KEEP_FORMATTING задано любое непустое значение, эти символы форматирования сохраняются. Это может быть полезно для оберток вокруг man, которые могут интерпретировать символы форматирования.

Таким образом, похоже, что ваш man отличается или какой-то параметр форматирования был указан псевдонимом или переменными среды, поэтому он выводит форматирование, даже когда вы перенаправляете вывод в текстовый файл

Видеть

6
phuclv 14 Мар 2021 в 04:52
2
Вы заметите, что man cd --ascii делает не то, что вы думаете. Однако это может сделать man --ascii cd (в зависимости от того, есть ли у вас руководство cd или нет). Более переносимый способ создания простого вывода ASCII man будет использовать -Tascii, а затем передать его через col -b.
 – 
Kusalananda
13 Мар 2021 в 11:18