bash命令在使用管道时保留颜色

bash命令在使用管道时保留颜色,bash,colors,pipe,xterm,Bash,Colors,Pipe,Xterm,可能重复: 设置 在本例中,特别是在将其传输到另一个命令时,我试图保留git status-s中的颜色 例如,一些git命令,diff和其他命令,如grep有一个选项--color=always,但git status没有 问题 有没有一种方法可以通过管道或捕获命令的输出,使它认为它正在输出到xterm shell,这样它就不会自动禁用颜色?大多数打印这些颜色代码的命令都会显式地检查stdout/stderr是否是tty(使用函数) 如果要保留颜色代码,可以在终端仿真器(如屏幕或直接记录器脚本

可能重复:

设置 在本例中,特别是在将其传输到另一个命令时,我试图保留git status-s中的颜色

例如,一些git命令,
diff
和其他命令,如
grep
有一个选项
--color=always
,但
git status
没有

问题
有没有一种方法可以通过管道或捕获命令的输出,使它认为它正在输出到xterm shell,这样它就不会自动禁用颜色?

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


如果要保留颜色代码,可以在终端仿真器(如
屏幕
或直接记录器
脚本
)中运行它,将输出保存到文件中。

以下是一个
脚本
片段,使用
ls
的彩色输出作为示例(在Mac OS X 10.6上)


script
命令是否可以写入变量?@rennat您可以保存到一个临时文件,然后从该文件读取到一个变量。这正是我想要的。谢谢,这不是容易多了吗@paradroid-对于“ls”更容易,但某些程序可能没有强制着色的选项。以您的示例为例,我如何保存
ls-G
)的返回代码(
$?
)?我想说最简单的方法是传递一个配置参数,如:git-c'color.ui=always'status | more-R
# 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"