77

编辑:

我想提出一个建议,即解析颜色通常是一个考虑不周的想法。

我想要它的部分原因是我可以解析它并在我自己的脚本输出中传递它。这……好吧,但使用瓷器或类似的东西并自己重新制作彩色零件可能会更明智!

原始问题如下。


我喜欢看颜色,因为我的脚本足够强大(到目前为止)可以处理颜色代码。看起来我在这里违背了规律,但老实说,我不明白必须解析脚本中的转义码之类的东西有什么大不了的。如果颜色有助于交互式使用,为什么它们不能帮助脚本使用,我可能会聚合数据并处理比手动更多的数据?颜色不是更重要吗?

无论如何,我有一个整洁的小 shell 脚本,我编写了 mungesgit status输出,我只是想让这个脚本保持颜色完整。我的全局 git 配置已设置,以便更改和未跟踪文件的列表在 git 状态中以颜色显示。不幸的是,我找不到git diff强制颜色的选项。git status

说得很清楚,这就是问题所在:

$ git status

产生完美的输出,但是(摘自我的脚本如下)

git status | sed "s/^#/\x1b[34m#[0m/"

不产生彩色git status输出,您甚至可以在这里看到我明确地将前导哈希字符转换为蓝色,因为它有助于突出显示脚本中不同的输出区域。

有谁知道如何让它熄灭颜色?是否有可以用作“假终端”STDIN/STDOUT 管道的标准程序?事实上,我也在开发一个 pty 伪终端工具,所以我当然可以为此目的使用它,但它是一个相当笨拙的解决方案(并且还没有准备好使用,因为我还没有完成构建它)。

4

3 回答 3

127

为避免更改您的 git 配置,您可以通过将配置变量与-c.

对于status命令,变量是color.status

    git -c color.status=always status | less -REX

对于diff、和命令show,变量为:loggrepcolor.ui

    git -c color.ui=always diff | less -REX

请注意,-c必须statusor参数之前,diff而不是之后。

或者,对于diffshow和命令loggrep您可以在命令--color=always 之后使用:

    git diff --color=always | less -REX

注意:正如 Steven 所说,如果您尝试提取有意义的数据,那么您可以使用解析颜色来提取含义,而不是解析颜色来--porcelain获得更友好的解析器输出。

    git status --porcelain | awk ...

然后,如果您愿意,您可以稍后重新引入颜色。

要获取用户配置的颜色,您可以使用git config --get-colour

    reset_color="$(tput sgr0)"
    remote_branch_color="$(git config --get-color color.branch.remote white)"

    echo "Pushing to ${remote_branch_color}${branch_name}${reset_color}"

这里还有一些例子。

于 2013-08-18T23:21:19.543 回答
22

编辑:

我想强烈建议解析颜色通常是一个考虑不周的想法。

我想要它的部分原因是我可以解析它并在我自己的脚本输出中传递它。这……好吧,但使用瓷器或类似的东西并自己重新制作彩色零件可能会更明智!

原始答案如下。


在提出问题后,我总是很快找到答案。与思考一个问题足够长的时间以将其写出来有关,以便您制定更好的方法来解决它。无论如何,解决这个问题只是

git config color.status always

我想通用解决方案涉及expectpty与强制任何需要它的程序认为它们在终端上有关的东西。

于 2013-04-18T03:01:20.900 回答
2

使用执行 shell 命令的 git 别名时,我遇到了同样的问题。显然 git shell 没有从当前环境继承,所以它对我的着色设置一无所知。

除了添加全局 git color ui 设置之外,我通过使我的别名如下所示来解决这个问题,它是需要被告知使用颜色的辅助命令,因为 git 默认情况下会在人们提到的任何 1.8.x 版本中使用。

[alias]
  ignored = !git ls-files -v|grep --color '^h'

现在,当以别名运行时,这会产生等效的彩色输出,就像我刚刚运行命令一样。

对于 sed,这个其他答案似乎更可靠,使用 tput。 https://unix.stackexchange.com/a/45954

于 2015-05-07T22:04:43.777 回答