编辑:
我想提出一个建议,解析颜色通常是一个考虑不周的想法。
我想要它的部分原因是我可以解析它并在我自己的脚本输出中传递它。这是……好吧,但使用瓷器或类似的东西并自己重新构建彩色部件可能会更明智!
原始问题如下。
我喜欢看到颜色,因为我的脚本足够强大(到目前为止)来处理颜色代码。看起来我确实违背了这里的原则,但老实说,我不明白必须解析脚本中的转义码之类的东西有什么大不了的。如果颜色有助于交互使用,为什么它们不能帮助脚本使用,因为我可能会聚合数据并处理比手动处理更多的数据?颜色不是更重要吗?
无论如何,我有一个简洁的小 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 配置,您可以通过使用
-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
--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}"
更多示例此处。
我强烈建议解析颜色通常是一个考虑不周的想法。
我想要它的部分原因是我可以解析它并在我自己的脚本输出中传递它。这是……好吧,但使用瓷器或类似的东西并自己重新构建彩色部件可能会更明智!原答案如下。
git config color.status always
我认为通用解决方案涉及
expect
或与强制任何需要它的程序认为它们位于终端上相关的东西
pty
。
除了添加全局 git color ui 设置之外,我还通过使我的别名如下所示来修复此问题,它是需要被告知使用颜色的辅助命令,因为 git 默认情况下会从人们提到的任何 1.8.x 版本开始.
[alias]
ignored = !git ls-files -v|grep --color '^h'
现在,当作为别名运行时,会产生等效的彩色输出,就像我刚刚运行命令一样。
对于 sed,另一个答案似乎工作更可靠,使用 tput。