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

bil*_*llc 72 bash shell terminal redirect colors

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

当我将此输出重定向到一个文件,然后catless更高版本的文件时,着色消失-大概B/C重定向剥离出来,告诉终端改变颜色的色码的输出的行为.

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

ata*_*lor 52

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

  • 一个例子:`script -q/dev/null ls | cat` (14认同)
  • 这会导致生成的文件包含颜色代码(当然); 有没有办法以一种利用颜色代码并正确显示终端颜色的方式打印文件?我试过`echo -e $(<filename)`,但这似乎不起作用. (2认同)

Wal*_*ndt 34

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

即使您在文件中有颜色代码,要查看它们,您还需要使用保持原封不动的工具. less有一个-r标志以"原始"模式显示文件数据; 这会显示颜色代码. 编辑:稍微更新的版本也有一个-R标志,它特别注意颜色代码并正确显示它们,更好地支持换行/修剪比原始模式,因为较少可以分辨哪些是控制代码,哪些是实际字符去屏幕.

  • `ls --color`与`ls --color = always`相同 - 你想的是`ls --color = auto` (3认同)
  • ⁺¹,您刚刚解决了我们的讨论,即应用程序确定它是重定向到文件,还是 shell 本身在重定向负责剥离颜色 ANSI 符号时解决了这个问题。 (2认同)

gee*_*ekQ 13

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

语境:

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

解:

script --flush --quiet --return /tmp/ansible-output.txt --command "my-ansible-command"
Run Code Online (Sandbox Code Playgroud)

开关说明:

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

  • 我喜欢它甚至可以与争论一起使用。要在写入文件的同时抑制终端输出,请将 `&gt; /dev/null` 添加到命令末尾(`script --flush --quiet --return /tmp/ansible-output.txt --command "my -ansible-command" &gt; /dev/null`)。 (2认同)
  • 添加“-a”标志以附加到日志文件。 (2认同)

alv*_*rre 10

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


Joe*_*Elf 9

我发现在使用script时保持颜色less并不能真正起作用(少了很多都搞砸了,退出时,bash都搞砸了)因为交互性较少.script似乎真的搞乱了stdin即使退出后的输入.

所以不是运行:

script -q /dev/null cargo build | less -R
Run Code Online (Sandbox Code Playgroud)

/dev/null在管道到较少之前我重定向到它:

script -q /dev/null cargo build < /dev/null | less -R
Run Code Online (Sandbox Code Playgroud)

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


Ric*_*man 6

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

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

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