【问题标题】:How to write stdout to file with colors?如何将标准输出写入带有颜色的文件?
【发布时间】:2015-02-08 11:05:19
【问题描述】:

很多时候(并非总是)标准输出以颜色显示。通常我也将每个输出日志保存在不同的文件中。自然在文件中,颜色不再显示。

我想知道是否有办法(在 Linux 中)将输出写入带有颜色的文件。我正在尝试使用tee 将 vagrant 的输出写入文件,这样我仍然可以看到输出(当它适用时)。我想专门为vagrant使用它(它可能会在未来改变,当然......)

【问题讨论】:

  • 通常写的程序决定它是否写到终端,如果不是,它不会使用颜色。所以这可能是告诉有问题的程序无论如何都要使用颜色的问题。有些程序有--color always之类的东西,但没有标准。

标签: linux bash terminal stdout


【解决方案1】:

我正在尝试这里列出的一些解决方案,并且我还意识到您可以使用 echo 命令和 -e 标志来做到这一点。

$ echo -e "\e[1;33m This is yellow text \e[0m" > sample.txt

接下来,我们可以查看我们的sample.txt文件的内容了。

$ cat sample.txt

Click link to see the output in yellow

此外,我们还可以使用 tee 并通过 echo 命令对其进行管道传输:

echo -e "\e[1;33m This is yellow text \e[0m" | tee -a sample.txt

【讨论】:

    【解决方案2】:

    在 macOS 上,script 来自 BSD 代码库,您可以像这样使用它:

    script -q /dev/null mvn dependency:tree mvn-tree.colours.txt

    它将运行 mvn dependency:tree 并将彩色输出存储到 mvn-tree.colours.txt

    tee 实用程序支持颜色,因此您可以通过管道查看命令进度:

    script -q /dev/null mvn dependency:tree | tee mvn-tree.colours.txt

    要获取script 手册,您可以输入man script

    SCRIPT(1)                 BSD General Commands Manual                SCRIPT(1)
    
    NAME
         script -- make typescript of terminal session
    
    SYNOPSIS
         script [-adkpqr] [-F pipe] [-t time] [file [command ...]]
    

    【讨论】:

      【解决方案3】:

      解决方案

      $ script -q /dev/null -c "your command" > log.txt
      $ cat log.txt
      

      说明

      根据scriptman page--quit 选项只能确保be quiet (do not write start and done messages to standard output)。这意味着开始和完成消息将始终写入文件。

      为了利用脚本并丢弃同一文件中的输出文件,我们可以简单地为其指定空设备/dev/null!此外,将输出重定向到我们想要的目的地,颜色内容将被写入目的地。

      【讨论】:

        【解决方案4】:

        在 Ubuntu 中,您可以安装包 bsdutils 以输出到 带有 ANSI 颜色代码的文本文件

        script -q -c "ls --color=always" /tmp/t
        

        安装kbtin以生成干净的HTML文件:

        ls --color=always | ansi2html > /tmp/t.html
        

        安装ahawkhtmltopdf 以生成漂亮的PDF

        ls --color=always | aha | wkhtmltopdf - /tmp/t.pdf
        

        将上述任何一项与tee 一起使用,也可以在控制台上显示输出或将副本保存在另一个文件中。示例:

        ls --color=always | tee /dev/stderr | aha | wkhtmltopdf - /tmp/test.pdf
        

        【讨论】:

          【解决方案5】:

          我发现使用名为 ansi2html.sh

          的工具

          是将彩色终端数据导出到html文件的最简单的方法,

          使用它的命令是:

          ls --color=always | ansi2html.sh --palette=solarized > ~/Desktop/ls.html
          
          • 只需使用管道发送输出,然后将标准输出输出到简单的 html 文件

          【讨论】:

            【解决方案6】:

            您还可以使用不同颜色的 echo 为输出着色,并将彩色输出保存在文件中。示例

            echo -e '\E[37;44m'"Hello World" > my_file
            

            您还必须熟悉终端颜色代码

            使用三通

            < command line > |tee -a 'my_colour_file'
            

            在 cat 中打开你的文件

            cat 'my_colour_file'
            

            使用命名管道也可以将管道的所有输出与颜色重定向到另一个文件

            例如

            创建命名管道

            mkfifo pipe.fifo
            

            每个命令行将其重定向到管道如下

            <command line> > pipe.fifo
            

            在另一个终端将所有消息从管道重定向到您的文件

            cat pipe.fifo > 'my_log_file_with_colours'
            

            用 cat 打开文件并查看预期结果。

            【讨论】:

            • 这里的问题是 Vagrant 输出已经有颜色了......我目前正在使用tee 将它们保存到文件中
            • 观察的不错..不过还是说明了彩色输出可以保存的原理。已编辑答案以纠正这个小细节。
            • 我也确定是可以做到的……但是我还是不知道怎么做。如果你有想法,请告诉我。
            • 好的,我编辑了我的答案,以演示另一种使用命名管道将每个命令行的所有彩色输出重定向到命名管道的方法
            • 我非常有信心这会起作用,但它不起作用:/(没有颜色)
            【解决方案7】:

            您可以将着色输出的 ANSI 序列保存到文件中:

            echo a | grep --color=always . > colour.txt
            cat colour.txt
            

            不过,有些程序倾向于使用它们,如果它们的输出没有发送到终端(这就是为什么我必须使用 --color-alwaysgrep)。

            【讨论】:

            • 你知道tee有没有办法做到这一点?
            • @AAlvz:你尝试的时候发生了什么? echo a | grep --color=always . | tee colour.txt
            • 无论如何都是红色的=/
            • @AAlvz:当然,grep 默认是这样配置的。我虽然这是你的问题:如何将颜色放入文件中。如果您想知道如何为输出着色,那就另当别论了。
            • @AAlvz:嗯,在我的示例中grep 的输出带有颜色,您可以在输出文件中看到相同的颜色。现在,您只需要调查是否有类似于--color=always 的 vagrant 选项,如果它对终端/文件输出敏感。
            【解决方案8】:

            由于许多程序仅在其标准输出为终端时才会输出颜色序列,因此该问题的一般解决方案需要诱使他们相信他们写入的管道是终端。这可以通过 bsdutils 的 script 命令实现:

            script -q -c "vagrant up" filename.txt
            

            这会将vagrant up 的输出写入filename.txt(和终端)。如果不需要回显,

            script -q -c "vagrant up" filename > /dev/null
            

            只会将其写入文件。

            【讨论】:

            • script 实际上非常轻巧。大多数情况下,它只是打开一个 pty,生成一个 shell 并将输出传递给您。总共有大约 500 行 C 代码。
            • 这不起作用 - 至少对于 debian 上的 bsdutils 1:2.25.2-6 中的脚本。 “ls -l”给出颜色。 "script -q -c 'ls -l'" 没有。
            • 脚本的brew版本没有-c操作符。
            • 对于 Mac OSX:script -q filename.txt vagrant up 有效。 usage: script [-adkpqr] [-t time] [file [command ...]]
            • 我知道我迟到了,但这会将Script started on Blah blah blah... 添加到文件中,即使带有-q 标志也是如此。有没有办法避免这种情况?
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-01
            • 2014-07-03
            • 2013-03-18
            • 2018-12-07
            • 2011-04-09
            相关资源
            最近更新 更多