我使用的各种bash命令 - 花哨的差异,构建脚本等,会产生大量的颜色输出。
当我将此输出重定向到文件,然后将文件重定向到cat
或less
时,颜色化已经消失 - 可能是b / c重定向输出的行为剥离了颜色代码告诉终端改变颜色。
有没有办法捕获彩色输出,包括着色?
答案 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
示例都不适用于我。
上下文:
behave
运行行为测试并在测试期间使用python subprocess.check_call()
解决方案:
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)
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