【问题标题】:Bash terminal and color output [closed]Bash终端和颜色输出[关闭]
【发布时间】:2012-12-25 15:09:50
【问题描述】:

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

man -P cat blabla > afile

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

cat afile

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

less afile

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

【问题讨论】:

  • cat的行为与shell无关。
  • 您确定转义序列在afile 中吗?默认情况下,man 不输出格式化序列,如果输出不去终端。请参阅man man 中对MAN_KEEP_FORMATTING envvar 的描述。

标签: linux macos bash shell


【解决方案1】:

查看您创建的文件。它看起来像这样(在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 显示彩色输出即使它没有显示在终端上。如果您查看VI 中的ls.txt,您会看到类似[34m^[[m^[[m 的序列。这告诉 ANSI 终端设置各种颜色,cat 将显示这些颜色(除非您使用 -v 选项)。

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

【讨论】:

  • 感谢您的清晰解释!
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的回答,这清楚地表明问题在于您指出的 man 输出格式。之前我没有意识到寻呼机与 groff 如此紧密地联系有没有人知道一个寻呼机只是用颜色转储流?
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 2016-01-14
    • 2013-04-05
    • 2019-10-19
    • 2014-01-12
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多