Bash终端和颜色输出

时间:2012-12-25 15:09:50

标签: linux macos bash shell

我有一个启用了颜色的shell:

$ man -P cat blabla > afile

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

$ cat afile

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

$ less afile

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

非常感谢

3 个答案:

答案 0 :(得分: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.txt中的VI,您会看到[34m^[[m^[[m等序列。这告诉ANSI终端设置各种颜色,cat将显示这些颜色(除非您使用-v选项)。

换句话说,你的假设是倒退的。 Cat正在为您提供文件的完美版本,而less命令正在输出,以粗体显示 letter-backspace-letter 序列。

希望这有助于澄清情况。

答案 1 :(得分:1)

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

另一方面,

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

您可以使用od -c afile | less查看此信息。您应该看到很多\b,但没有\e

答案 2 :(得分:1)

这是解决方案(当然它是在联机帮助页中的某个地方:D)。我正在寻找的命令叫做ul:

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

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

感谢大家的帮助