shell-强制“ git status”在终端上输出颜色(在脚本内)

编辑:

我想提出一个建议,即解析颜色通常是一个构思错误的想法。

我想要它的部分原因是我既可以解析它,又可以将其传递到我自己的脚本输出中。 没关系,但是使用瓷器或类似物品自己重建彩色零件可能会更明智!

原始问题如下。


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

无论如何,我有一个简洁的小shell脚本,该脚本编写了git status输出,而我只是想使此脚本保持原样。 设置了我的全局git配置,以便在git状态下以彩色显示更改和未跟踪的文件列表。 不幸的是,与git diff不同,我无法找到为git status强制设置颜色的选项。

要明确地说,这是问题所在:

$ git status

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

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

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

有谁知道如何使它熄灭颜色? 我是否可以使用一个可用作“假终端” STDIN / STDOUT管道的标准程序? 实际上,我也在开发pty伪终端工具,因此我当然可以为此目的使用它,但这是一个比较繁琐的解决方案(由于我尚未完成构建,因此尚未准备就绪)。

Steven Lu asked 2019-11-18T05:59:41Z
3个解决方案
86 votes

为了避免更改git config,您可以仅对当前命令执行此操作,方法是将config变量传递给-c

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

该变量仅适用于-c命令。 对于-c-c-c,变量为-c

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

注意-c必须在statusdiff自变量之前,而不是之后。

joeytwiddle answered 2019-11-18T06:00:25Z
20 votes

编辑:

我强烈建议解析颜色是一个通常不正确的想法。

我想要它的部分原因是我既可以解析它,又可以将其传递到我自己的脚本输出中。 没关系,但是使用瓷器或类似物品自己重建彩色零件可能会更明智!

原始答案如下。


提出问题后,我会一直很快找到答案。 与思考问题足够长的时间有关,可以写出为解决问题制定更好的方法。 无论如何,解决方案只是

git config color.status always

我认为通用解决方案涉及expect或与pty有关的问题,这些问题迫使任何需要它的程序都认为它们在终端上。

Steven Lu answered 2019-11-18T06:01:15Z
2 votes

使用执行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]

dragon788 answered 2019-11-18T06:02:02Z
translate from https://stackoverflow.com:/questions/16073708/force-git-status-to-output-color-on-the-terminal-inside-a-script