为什么文本编辑器显示与 cat 命令不同

shi*_*hin 5 man editors cat

我跑:

$ man cd > mancd
$ cat mancd
Run Code Online (Sandbox Code Playgroud)

这按预期显示。但是当我用 VSCode 和 vim 打开文件时,它们是完全不同的。

在此处输入图片说明

在此处输入图片说明

为什么会这样以及如何将手册页正确重定向到文件。

phu*_*clv 6

请注意^H上面屏幕截图中的很多内容。这意味着Ctrl+H产生 ASCII 08 字符 AKA Backspace。打印字符时,使用Backspace将光标移回,然后再次覆盖相同的字符, 然后它会显得更暗。这就是在机械打字机中实现粗体文本的方式。各种现代电子终端也支持这一点,许多 CLI 工具确实使用它进行文本格式化。以Escape (ASCII 27)开头的ANSI 序列也常用于更改光标位置和文本格式属性,如闪烁、颜色、斜体……那些或控制字符0827字符被称为.

cat对这些字节一无所知。它只是将原始字节流传递到终端或管道中的下一项。由于终端知道这些控制字符,它会正确显示文本。但是,vi或者 VS 代码不是终端,而是在将控制字符显示在其窗口内之前对其进行翻译,以便意外的控制字符不会弄乱他们的屏幕和终端

要禁用控制字符并仅输出纯文本,请检查您使用的工具的选项。请man注意Controlling formatted output手册页中的部分。尝试类似的东西man --ascii cd

然而,大多数程序会自动确定输出的类型以了解它是否应该输出控制字符,例如大多数 GNU 工具使用--color类似ls或的选项grep。也是如此man

  • MAN_KEEP_FORMATTING

    通常,当输出没有被定向到终端(例如文件或管道)时,格式化字符会被丢弃,以便在没有特殊工具的情况下更容易阅读结果。但是,如果$MAN_KEEP_FORMATTING设置为任何非空值,则保留这些格式字符。这对于可以解释格式化字符的 man 包装器可能很有用。

所以看起来你man是不同的,或者别名或环境变量已经指定了一些格式选项,所以即使你将输出重定向到文本文件,它也会输出格式

  • 你会注意到 `man cd --ascii` 并没有像你想象的那样做。然而,`man --ascii cd` 可能会这样做(取决于你是否有 `cd` 手册)。生成纯 ASCII 输出 `man` 的更便携方法是使用 `-Tascii`,然后通过 `col -b` 传递它。 (2认同)