Bash命令在管道中保留颜色

43

可能是重复问题:
能否通过shell重定向捕获彩色输出?

设置

在这种情况下,我特别想保留git status -s中的颜色,并将其传输到另一个命令。

一些git命令,例如 diff,以及其他命令如 grep 都有一个 --color=always 的选项,但 git status 没有。

问题

有没有办法管道或捕获命令的输出,并使它认为正在输出到xterm shell,以便自动禁用颜色?


我会说最简单的方法是通过传递一个配置参数,如:git -c 'color.ui=always' status | more -R - joynes
2个回答

34

下面是一个使用带有颜色的ls输出作为示例(在Mac OS X 10.6上)的script代码片段。

# no colored ls output if stdout is a pipe (and not a tty)
ls -G /
ls -G / | cat
script -q /dev/null ls -G / | tr -d '\r' | cat

# write output of script command to a variable
var="$(script -q /dev/null ls -G / | tr -d '\r' | cat)"
echo "$var"

2
这不是更容易吗?http://serverfault.com/a/26521/50948 - paradroid
3
对于“ls”命令来说更容易,但有些程序可能没有强制着色的选项。 - Adam S
UUOC? - ford
使用您的示例,我该如何保存ls -G的返回代码($?)? - Lux
脚本的-e选项使得返回代码可以传递。 - Aiden Woodruff
为什么要使用 tr -d '\r' - theonlygusti

7

大多数打印出这些颜色代码的命令会显式地检查stdout/stderr是否是终端(使用isatty函数)。

如果您想保留颜色代码,可以在类似于screen或直接记录器script的终端仿真器中运行它,并将输出保存到文件中。


script 命令可以被告知写入一个变量吗? - rennat
@rennat,你可以将数据保存到临时文件中,然后从文件中读取到变量中。 - Foo Bah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接