Невозможно применить яркость к цвету фона терминала

Невозможно применить яркость к цвету фона терминала

У меня проблема с цветами в моем эмуляторе терминала. Я использую его LXTerminalкак эмулятор терминала и LXDEкак среду рабочего стола.

Следующая команда должна печатать красный текст на сером фоне:

printf "\n\033[1;31;40m"hello"\033[00m\n\n"

но это не работает. Серый фон отсутствует (красный текст в порядке). На моей старой машине ( Gnome/Gnome Terminal) все работает отлично

Я пробовал устанавливать несколько других эмуляторов терминала, но проблема осталась. Я даже не уверен, связана ли эта проблема с эмулятором терминала или с чем-то еще. В консоли (CTRL+ALT+F1) серый цвет фона не работает ни на одной из машин)

Эта проблема касается только серого фона. Все другие цвета работают нормально, например, следующий пример печатает красный текст на зеленом фоне.

printf "\n\033[1;31;42m"hello"\033[00m\n\n"

Буду признателен за любую помощь. Даже не знаю, с чего начать устранение неполадок.

решение1

Существует восемь стандартных цветов ANSI, поддерживаемых каждым эмулятором терминала. Большинство эмуляторов терминала также имеют восемь ярких вариантов стандартных цветов ANSI.

Однако фактические значения цветов, с которыми сопоставляются escape-коды, не стандартизированы, и на самом деле они часто немного различаются в зависимости от эмулятора терминала. Поэтому, если вы печатаете printf "\e[31;47mTest\n"красный текст на белом фоне, фактические оттенки красного и белого, которые вы получите, могут отличаться в зависимости от используемого вами эмулятора терминала.

Так что это частично объясняет проблему: значения цветов не являются стандартными и LXTerminalмогут иметь другие значения по умолчанию для своей цветовой палитры, к которым вы не привыкли. Если вы посмотрите в настройках, обычно вы можете настроить цветовую схему так, как вам нравится.

Другая проблема, с которой вы сталкиваетесь, заключается в том, что то, что делает атрибут bold, также не стандартизировано. Есть три возможности: он может сделать шрифт жирным, он может сделать цвет переднего плана ярче или он может и сделать цвет переднего плана ярче, и сделать шрифт жирным.

Опять же, поведение по умолчанию здесь различается в зависимости от эмулятора терминала, и вы обычно можете изменить его, если найдете правильную настройку. Grep для чего-то, упоминающего «жирный» или «яркий».

Если вы хотите использовать яркий цвет, то вы можете использовать так называемые коды управления цветом aixterm вместо жирного. Они не являются стандартными, но поддерживаются во всех известных мне современных эмуляторах терминала. В отличие от жирного, они всегда используют яркие цвета, плюс их можно использовать для отображения ярких фоновых цветов.

Например, если вы хотите напечатать ярко-красный текст на ярко-белом фоне, вам нужно сделать следующее: printf "\e[91;107mTest\n".

Для справки, вот таблица всех кодов цветовых переходов:

|    ANSI |    ANSI |    ANSI    |                | Aixterm | Aixterm 
|   Color | FG Code | BG Code    | Bright Color   | FG Code | BG Code 
+---------+---------+--------    +----------------+---------+-------- 
|   Black |      30 |      40    |   Bright Black |      90 |     100 
|     Red |      31 |      41    |     Bright Red |      91 |     101 
|   Green |      32 |      42    |   Bright Green |      92 |     102 
|  Yellow |      33 |      43    |  Bright Yellow |      93 |     103 
|    Blue |      34 |      44    |    Bright Blue |      94 |     104 
| Magenta |      35 |      45    | Bright Magenta |      95 |     105 
|    Cyan |      36 |      46    |    Bright Cyan |      96 |     106 
|   White |      37 |      47    |   Bright White |      97 |     107 

решение2

Атрибут 1в начале 1;31;40включает режим "жирный" (он же "яркий"), но некоторые терминалы применяют его только к цвету переднего плана. Понятия не имею, по какой причине (и изменение переменной $TERM не имеет значения), поскольку они поддерживают 16 цветов переднего плана. 1 0 (из 40: 4 = фон, 0 = цвет) на самом деле черный, но "ярко-черный" — серый. Вот два решения:

  • Цвет 7 (белый), скорее всего, окажется серым, а не белым (для настоящего белого цвета вам нужен «ярко-белый», то есть фон, который на самом деле не может быть белым).

  • Вы должны иметь возможность использовать терминал gnome в LXDE, если хотите. Просто установите его и начните с gnome-terminal(я думаю, это имя его команды). Затем вам придется настроить все лаунчеры на использование его вместо lx-terminal.

1 Вот мое предположение: обратите внимание, что установка жирного шрифта применяет яркость к цвету переднего плана.идобавляет жирный акцент. Следовательно, вы не можете использовать яркий цвет переднего плана, не применяя также жирный. Вероятно, когда были распространены монохромные терминалы, простое выделение жирным шрифтом, например: \\033[1mBlah blah\\033[0mбыло распространено -- и на самом деле это все еще будет работать, но это также сделает ваш цвет переднего плана ярким. Если бы мы посчитали нежелательным, чтобы это также осветляло фон (потому что он просто должен быть жирным), то мы бы убедились, что реализация этого не делает. Ну что ж.

решение3

Вот трюк, который вы можете использовать с некоторыми эмуляторами терминала. Он даст вам яркие цвета фона, используя атрибут reverse-video (7), чтобы выбрать яркий цвет переднего плана, а затем поменять его местами с цветом фона.

echo -e "\e[1;32;7mText on a bright green background"

Загвоздка в том, что хотя теперь вы можете иметь 16 фоновых цветов, ограничение в 8 цветов теперь применяется к переднему плану/тексту. И чтобы еще больше запутать ситуацию, пока атрибут reverse-video активен, вам придется задать цвет текста, используя коды атрибутов для фоновых цветов!

решение4

При использовании 47=background whiteвместо 40=background blackвы получите нежирный белый фон.

]# printf "\033[0;30;47m"hello"\033[00m\n"
hello (black on grey)
]# printf "\033[1;30;47m"hello"\033[00m\n"
hello (darkgrey on grey)
]# printf "\033[1;37;47m"hello"\033[00m\n"
hello (white on grey)
]# printf "\033[0;37;47m"hello"\033[00m\n"
hello (INVISIBLE grey on grey)

По умолчанию жирный черный цвет дает темно-серый. Обычный белый цвет на самом деле серый, потому что жирный белый цвет — это белый.


Этот цикл печатает два столбца со всеми комбинациями «цвет на черном» и «белый на цветном».

for ((i=30; i<=47; i++))
do
    echo -en  "\e[${i}mHello\e[0m";
    echo -e "\e[1;${i}mHello\e[0m";
done

Он начинается с невидимого черного и темно-серого на черном, но остальные 17 линий выглядят хорошо и демонстрируют всю цветовую палитру консоли.

(38 и 39 следует исключить, но для простоты я просто пробегаю от 30 до 47)


Принятые упоминания А.восемьцвета и отсутствие стандартов.

Шесть цветов 31-36 (от красного до голубого) хорошо определены. Черный (30) и белый (37) также, но их смелые варианты менее выражены, особенно в качестве фона (40 и 47).


Я только что заметил: в xterm обычный белый текст виден на сером фоне, но в консоли Linux — нет. (последняя строка, с i=47) (до 30 минут назад скрипт останавливался на 46, потому что я не хотел, чтобы были нечитаемые варианты)

В обоих случаях при выборе мышью текст умело адаптируется и остается читаемым при перевороте.

Связанный контент