我有一个启用了颜色的外壳:
man -P cat blabla > afile
somefile包含用于着色的转义字符。现在我想用它的颜色将somefile输出到终端。我试过:
cat afile
但根本没有任何格式。我发现的唯一方法是使用
less afile
但我不想要寻呼机。我只想输出文件而不进入一些交互模式。必须有一个简单的命令来做到这一点,但我找不到它:)
查看您创建的文件。它看起来像这样(在vi中查看时):
LS(1) BSD General Commands Manual LS(1)
N^HNA^HAM^HME^HE
l^Hls^Hs -- list directory contents
S^HSY^HYN^HNO^HOP^HPS^HSI^HIS^HS
l^Hls^Hs [-^H-A^HAB^HBC^HCF^HFG^HGH^HHL^HLO^HOP^HPR^HRS^HST^HTU^HUW^HW@^H@a^Hab^Hbc^Hcd^Hde^Hef^Hfg^Hgh^Hhi^Hik^Hkl^Hlm^Hmn^Hno^Hop^Hpq^Hqr^Hrs^Hst^Htu^Huw^Hwx^Hx1^H1] [_^Hf_^Hi_^Hl_^He _^H._^H._^H.]
D^HDE^HES^HSC^HCR^HRI^HIP^HPT^HTI^HIO^HON^HN
For each operand that names a _^Hf_^Hi_^Hl_^He of a type other than directory, l^Hls^Hs
displays its name as well as any requested, associated information. For
each operand that names a _^Hf_^Hi_^Hl_^He of type directory, l^Hls^Hs displays the names
of files contained within that directory, as well as any requested, asso-
ciated information.
看到了^H
吗?这意味着备份一个空间。该man
命令生成troff输出,然后将该输出通过管道传输到 nroff 本身以格式化该输出以供显示。Troff 是一个格式化打印页面的文本格式化程序。因此,要加粗一个单词,troff
将在一个字母上退格并在其上键入。这样做的次数越多,字母就越黑。
当您在终端上使用man
或nroff
时,它会理解这B^HB
意味着粗体B
,并将以终端突出显示的颜色显示该字母。该less
命令做同样的事情。
另一方面,您的cat
命令实际上是按原样显示文件。当它看到序列B^HB
时,它会B
在您的屏幕上显示一个,备份一个空格,并B
在前一个的顶部显示另一个B
。由于这是终端而不是打印机,因此第二个B
显示在与前一个相同的像素之上B
。
试试这个(因为你在 Mac 上):
CLICOLOR_FORCE=1
ls > ls.txt
cat ls.txt
请注意,这确实显示了颜色。设置CLICOLOR_FORCE
环境变量会强制ls
显示彩色输出,即使它没有显示在终端上。如果您查看ls.txt
in VI
,您会看到类似[34m
和的序列^[[m^[[m
。这告诉 ANSI 终端设置各种颜色,cat
并将显示这些颜色(除非您使用该-v
选项)。
换句话说,你的假设是倒退的。Cat 为您提供了文件的完美再现版本,而该less
命令正在处理输出以将字母-退格-字母序列显示为粗体。
man
实际上并没有将终端转义序列放在其输出中。要制作粗体字符,它会输出char <backspace> char
,而对于下划线,它会输出_ <backspace> char
。寻呼机喜欢more
并less
识别这些序列,并将它们转换为适当的终端转义序列,以显示粗体和下划线。
cat
,另一方面,只输出文件中的内容。它不知道如何进行终端特定的翻译。当终端收到 a<backspace>
时,它只是将光标向上备份并用下一个字符输出覆盖它。结果是您获得了没有额外标记的可读文本(这就是为什么man
在下划线时首先发送下划线 - 如果它以另一种方式执行,您只会看到一堆下划线,其中一个单词是预期的)。
你可以看到这个od -c afile | less
。你应该看到很多\b
,但没有\e
。