彩色输出可以通过shellredirect捕获吗?
我使用的各种bash命令 – 幻想差异,构build脚本等,产生大量的颜色输出。
当我把这个输出redirect到一个文件,然后cat
或less
的文件后,颜色消失 – 大概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
使脚本传播我的命令的退出代码,所以我知道我的命令是否失败