0

我有一个启用了颜色的外壳:

man -P cat blabla > afile

somefile包含用于着色的转义字符。现在我想它的颜色将somefile输出到终端。我试过:

cat afile

但根本没有任何格式。我发现的唯一方法是使用

less afile

但我不想要寻呼机。我只想输出文件而不进入一些交互模式。必须有一个简单的命令来做到这一点,但我找不到它:)

4

3 回答 3

3

查看您创建的文件。它看起来像这样(在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将在一个字母上退格并在其上键入。这样做的次数越多,字母就越黑。

当您在终端上使用mannroff时,它会理解这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.txtin VI,您会看到类似[34m和的序列^[[m^[[m。这告诉 ANSI 终端设置各种颜色,cat并将显示这些颜色(除非您使用该-v选项)。

换句话说,你的假设是倒退的。Cat 为您提供了文件的完美再现版本,而该less命令正在处理输出以将字母-退格-字母序列显示为粗体。

于 2012-12-25T16:02:42.013 回答
1

man实际上并没有将终端转义序列放在其输出中。要制作粗体字符,它会输出char <backspace> char,而对于下划线,它会输出_ <backspace> char。寻呼机喜欢moreless识别这些序列,并将它们转换为适当的终端转义序列,以显示粗体和下划线。

cat,另一方面,只输出文件中的内容。它不知道如何进行终端特定的翻译。当终端收到 a<backspace>时,它只是将光标向上备份并用下一个字符输出覆盖它。结果是您获得了没有额外标记的可读文本(这就是为什么man在下划线时首先发送下划线 - 如果它以另一种方式执行,您只会看到一堆下划线,其中一个单词是预期的)。

你可以看到这个od -c afile | less。你应该看到很多\b,但没有\e

于 2012-12-25T15:35:03.983 回答
1

我正在寻找的命令被称为ul(做下划线):

/usr/bin/man -P cat somecommand | ul

它为终端很好地格式化了来自groff的 BACKSPACE 转义格式。

于 2012-12-25T23:10:05.930 回答