捕获彩色输出到bash变量

时间:2011-07-26 09:20:14

标签: bash variables colors

我想从变量中捕获git status的颜色输出并稍后打印。

到目前为止,我已经做到了:

status=$(git status -s)
echo -e "$status"

上面的脚本保持换行符不变(thx到Capturing multiple line output into a Bash variable)但从输出中删除颜色。

有没有办法让颜色保持在变量中并回显它?

3 个答案:

答案 0 :(得分:9)

问题不是bash在存储文本之前剥离了颜色输出,但是git拒绝在第一时间产生彩色输出,可能是因为它可以告诉它的STDOUT不是终端。许多命令执行此操作(例如ls)。其中大多数都有一个选项,告诉他们无论如何都要使用颜色,以便在这种情况下使用(例如--colorls)。请查阅您的git文档是否还有这样的覆盖选项。

答案 1 :(得分:1)

对于特定于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)

答案 2 :(得分:1)

正如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"