彩色输出可以通过shellredirect捕获吗?

我使用的各种bash命令 – 幻想差异,构build脚本等,产生大量的颜色输出。

当我把这个输出redirect到一个文件,然后catless的文件后,颜色消失 – 大概b / credirect输出的行为去除了颜色代码,告诉terminal改变颜色。

有没有办法捕捉彩色输出,包括彩色?

捕获彩色输出的一种方法是使用script命令。 运行script将启动一个bash会话,其中所有的原始输出都被捕获到一个文件(默认情况下命名为typescript )。

redirect不会剥去颜色,但许多命令会检测何时将输出发送到terminal,如果不是,则默认情况下不会产生颜色。 例如,在Linux上, ls --color=auto (在很多地方被别名为ls在输出到pipe道或文件时不会生成颜色代码,但ls --color将会生成颜色代码。 许多其他工具具有类似的覆盖标志,以使它们将彩色输出保存到文件中,但是这些工具都是特定于个别工具的。

即使一旦你在一个文件中的颜色代码,看到他们,你需要使用一个工具,保持完好。 less有一个-r标志以“原始”模式显示文件数据; 这显示颜色代码。 编辑:稍微更新的版本也有一个-R标志,它是专门意识到颜色代码并正确显示它们,比原始模式更好地支持像换行/修剪等事情,因为更less可以告诉哪些东西是控制代码,哪些实际上是字符去屏幕。

有些程序在意识到输出不是TTY(即将其redirect到另一个程序时)时会消除着色。 你可以告诉其中一些人强行使用颜色,并告诉寻呼机打开彩色,例如使用less -R

我发现,使用script来保存颜色时,pipe道less到真的没有工作(less是所有搞砸和退出,bash都搞砸了),因为less是交互。 script似乎真的搞乱input来自stdin甚至退出后。

所以,而不是运行:

 script -q /dev/null cargo build | less -R 

我redirect/dev/null之前pipe道到less:

 script -q /dev/null cargo build < /dev/null | less -R 

所以现在script不会stdin并得到我正是我想要的。 这等于command | less 但它保留了颜色,同时也继续读取附加到文件的新内容(我尝试过的其他方法不会这样做)。

我使用tee :将命令的输出输出到tee filename ,并保持颜色。 如果你不想在屏幕上看到输出(这是tee同时显示和redirect输出),那么只需将tee的输出发送到/dev/null

command | tee | tee filename > /dev/null

这个超级用户的问题帮助我,当我的其他答案 (涉及tee )不起作用。 它涉及使用unbuffer使命令认为它从shell运行。

我安装它使用sudo apt install expect tcl而不是sudo apt-get install expect-dev

具有讽刺意味的是,当redirectapt的输出时,我需要使用这个方法。

受其他答案的启发,我开始使用script 。 我不得不使用-c来让它工作。 所有其他的答案,包括tee ,不同的script例子都不适合我。

语境:

  • Ubuntu 16.04
  • 在python的subprocess.check_call()testing期间运行行为testing,并启动shell命令。

解:

 script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command" 

交换机的说明:

  • --flush需要--flush ,因为否则,产出不能很好地观察到,大块进来
  • --quiet抑制脚本工具的输出
  • -c, --command命令直接提供执行的命令,从我的命令到脚本pipe道没有为我工作(没有颜色)
  • --return使脚本传播我的命令的退出代码,所以我知道我的命令是否失败