Почему при использовании часов не отображаются мерзкие цвета?

10

При беге 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вывода?

Дрю Ноакс
источник
Связанный: stackoverflow.com/questions/3793126/…
jobin
@Jobin, спасибо, я действительно прокомментировал эту ссылку, прежде чем опубликовать этот вопрос :)
Drew Noakes

Ответы:

5

Следующие утверждения верны:

  • watchзапускает команду в новой оболочке sh.
  • .bashrcпсевдонимы , lsкак ls --color=autoдля того, чтобы цвет.
  • shне наследует и не использует bashпсевдонимы.

Поэтому, когда watchзапускается ls, он не запрашивает цвета, он просто запускает старую версию. Вы можете обойти это, но, как указывает адитья, вам также нужно включить цвета, 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 status -sb, хотя и работает ls --color.
Jobin
Это имеет смысл. Однако псевдоним для git. Окраска устанавливается в конфигурации git напрямую . Так что это не проблема с алиасами.
Дрю Ноакс
Бинго. Я бы установил свои цвета, autoкоторые, как вы правильно догадывались, заставляли git избегать вывода цвета. Использование alwaysвместо этого решило эту проблему. Большое спасибо!
Дрю Ноакс
9

git использует значение конфигурации, чтобы определить, показывать ли цветной вывод или нет.

Например:

git config --global color.ui auto

Это устанавливает цветовую настройку autoглобально. В autoрежиме git определит, является ли это реальным терминалом, перед отправкой цветовых кодов, как предположил Оли.

Вы можете принудительно установить это глобальное значение always, однако лучшей идеей может быть его применение к определенной команде:

git -c color.status=always status -sb

Собираем все вместе:

watch --color git -c color.status=always status -sb
Дрю Ноакс
источник
0

Это работает, если git( --color) и watch( -c) сказано использовать цвета:

watch -cd "git branch -va --color"
sjas
источник