为什么使用 watch 时 git 没有显示颜色?

为什么使用 watch 时 git 没有显示颜色?

运行时git status -sb我看到:

在此处输入图片描述

我想要watch(来自 procps-ng 3.3.3)一个存储库。该--color选项应该保留颜色。


有趣的是,它适用于ls

$ watch --color "ls --color"

显示:

ls 的输出


然而git颜色消失了:

$ watch --color "git status -sb"

在此处输入图片描述


那么,为什么watch显示颜色ls而不是git输出颜色?

答案1

git使用配置值来确定是否显示彩色输出。

例如:

git config --global color.ui auto

这将颜色设置设置为auto全局。在auto模式下,git 将在发送颜色代码之前确定它是否是真实终端,正如 Oli 所建议的那样。

您可以强制此全局值always,但更好的想法可能是将其应用于特定命令:

git -c color.status=always status -sb

综合起来:

watch --color git -c color.status=always status -sb

答案2

以下陈述是正确的:

  • watch在新 shell 中运行该命令sh
  • .bashrc别名lsls --color=auto启用颜色。
  • sh不继承或使用bash别名。

watch因此,运行时ls,它不会要求颜色,而只是运行普通的旧版本。您可以规避这一点,但正如 aditya 指出的那样,您还需要启用颜色,watch以便它正确处理颜色。

一个工作示例ls是:

watch --color -- ls --color=always

如果您不继续--color观看,您会看到一堆丑陋的颜色代码。


ls --color被解释为ls --color=always

ls --color=auto 才不是在手表上打印颜色。这表明它从终端本身推断出颜色支持。

欲了解更多原因,我们可以测试手表外壳是否认为这是一个真正的终端

$ bash -c '[[ -t 1 ]] && echo "real terminal"'
real terminal

$ watch -- "bash -c '[[ -t 1 ]] && echo "real terminal"'"
# ... nothing.

我怀疑一些应用程序正在查看这个(或类似的东西)来判断是否应该打开颜色。

答案3

如果git( --color) 和watch( -c) 被告知使用颜色,它就会起作用:

watch -cd "git branch -va --color"

相关内容