可以通过shell重定向捕获彩色输出吗?

时间:2010-08-18 18:11:28

标签: bash shell colors terminal redirect

我使用的各种bash命令 - 花哨的差异,构建脚本等,会产生大量的颜色输出。

当我将此输出重定向到文件,然后将文件重定向到catless时,颜色化已经消失 - 可能是b / c重定向输出的行为剥离了颜色代码告诉终端改变颜色。

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

7 个答案:

答案 0 :(得分:50)

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

答案 1 :(得分:33)

重定向不会剥离颜色,但许多命令会检测它们何时向终端发送输出,如果不是,则默认情况下不会生成颜色。例如,在Linux上ls --color=auto(在许多地方使用别名为普通ls)如果输出到管道或文件,则不会生成颜色代码,但ls --color会生成颜色代码。许多其他工具具有类似的覆盖标记,以使它们将彩色输出保存到文件中,但它都是特定于单个工具的。

即使你在文件中有颜色代码,要看到它们,你需要使用一个完整的工具。 less有一个-r标志,以“原始”模式显示文件数据;这会显示颜色代码。 编辑:稍微更新的版本还有一个-R标志,它特别注意颜色代码并正确显示它们,更好地支持换行/修剪等原始模式,因为较少可以分辨哪些是控制代码,实际上是进入屏幕的字符。

答案 2 :(得分:10)

某些程序在意识到输出不是TTY时(即将它们重定向到另一个程序时)会删除颜色。您可以告诉其中一些人强行使用颜色,并告诉寻呼机打开颜色,例如使用less -R

答案 3 :(得分:10)

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

上下文:

  • Ubuntu 16.04
  • 使用behave运行行为测试并在测试期间使用python subprocess.check_call()
  • 启动shell命令

解决方案:

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

开关说明:

  • --flush是必需的,因为否则输出不是很好的可观察的,大块的
  • --quiet取代了自己的脚本工具输出
  • -c, --command直接提供执行命令,从我的命令到脚本的管道对我不起作用(没有颜色)
  • --return使脚本传播我的命令的退出代码,以便我知道我的命令是否失败

答案 4 :(得分:8)

我发现使用script来保存颜色时,管道到less并不真正起作用(少了很多就搞砸了,退出时,bash都搞砸了)因为交互性较少。 script似乎真的搞砸了来自stdin的输入,即使退出后也是如此。

所以不要运行:

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

我将/dev/null重定向到它之前,管道到less:

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

所以现在script并没有弄乱stdin,而是让我得到了我想要的东西。它相当于command | less,但它保留了颜色,同时还继续读取附加到文件的新内容(我试过的其他方法也不会这样做)。

答案 5 :(得分:3)

This question(涉及tee)无效时,

other answer超级用户帮助了我。它涉及使用unbuffer使命令认为它是从shell运行的。

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

我需要在重定向apt的输出时使用此方法,具有讽刺意义。

答案 6 :(得分:-3)

我使用tee:将命令的输出传递给tee filename ,并保持颜色。如果您不想在屏幕上看到输出(这是tee的用途:同时显示和重定向输出),那么只需将tee的输出发送到{ {1}}:

/dev/null command | tee filename