将有颜色输出的结果存储到bash变量中

16
我想在一个变量中捕获来自git status的颜色输出,并稍后将其打印出来。 目前我已经做到了:
status=$(git status -s)
echo -e "$status"

以上脚本保留了换行符(感谢将多行输出捕获到Bash变量中),但是剥离了输出的颜色。

有没有一种方法可以保留颜色并将其回显到变量中?

3个回答

13
问题不在于bash存储文本之前会剥离颜色输出,而是git一开始就拒绝生成带有颜色的输出,可能是因为它可以判断其标准输出不是终端。许多命令都会这样做(例如ls)。其中大部分都有一个选项来告诉它们无论如何使用颜色,以在这种情况下使用(例如ls的--color选项)。请查阅您的git文档,了解它是否也有这样的覆盖选项。

1
对我而言,我需要将 color.status 改成 always 而不是 color.ui - ndbroadbent

6

对于与git相关的解决方案,您可以通过color.status配置选项强制git提供颜色。要覆盖此单个命令的配置条目,请使用git -c color.status=always status

请记住,以这种方式捕获的命令输出不一定包括尾随换行符,因此如果您计划稍后打印它,则需要添加该换行符。

out=$(git -c color.status=always status)
printf "$out\n"

如果需要一种更通用的解决方案,适用于其他不提供颜色覆盖的程序,则最好的方法是使用脚本,如Can colorized output be captured via shell redirect?所示。

在这些情况下,您应该使用 status=$(script -q /dev/null git status | cat)


3
如Kilian Foth所提到的:
“请查阅您的git文档,看看它是否也有这样的覆盖选项”
Git文档说(http://git-scm.com/book/en/Customizing-Git-Git-Configuration#Colors-in-Git):
“如果您希望在重定向输出中使用颜色代码,可以将--color标志传递给Git命令,强制其使用颜色代码”
我正在使用git版本1.9.2,尝试“git status --color”和“git --color status”,但似乎都没有有效的标志。可能还没有实现?
然而,使用以下内容捕获ls的彩色输出是有效的:
IFS=""
output=$(ls -l --color)
echo -e "$output"

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