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

问题描述 投票:0回答:3

编辑:

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

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

原始问题如下。


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

无论如何,我有一个简洁的小 shell 脚本,我编写了 munges

git status
输出,我只是想让这个脚本保持颜色完整。我的全局 git 配置已设置,以便已更改和未跟踪的文件列表在 git 状态中以颜色显示。不幸的是,与
git diff
不同,我找不到强制
git status
着色的选项。

更清楚地说,这就是问题所在:

$ git status

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

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

不产生彩色

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

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

git shell unix io terminal
3个回答
152
投票

为了避免更改 git 配置,您可以通过使用

-c
传递配置变量来仅为当前命令启用颜色。

对于 git 版本 (< 2.20.1)

status
变量是
color.status
:

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

在现代 git 版本中,对于

diff
show
log
grep
命令,变量为
color.ui
:

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

备注:

  • 假设您>2.20.1,

    color.ui=always
    更可取,因为它在子命令之间是一致的。

  • -c
    必须出现在status
    diff
    参数之前
    ,而不是之后。

  • 或者,对于

    diff

    show
    log
    grep
     命令,您可以使用 
    --color=always
     
    after 命令:

    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}"
更多示例

此处


24
投票
编辑:

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

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

原答案如下。


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

git config color.status always

我认为通用解决方案涉及

expect

 或与强制任何需要它的程序认为它们位于终端上相关的东西 
pty


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

© www.soinside.com 2019 - 2024. All rights reserved.