Определены ли последовательности выхода цвета терминала для bash?

22

Я часто использовал цвета в скриптах Bash (в основном в CentOS), но чтобы сделать их использование более удобным, я в итоге переопределяю переменные в значения цвета:

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

или также с tput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

Я бродил по /etc/rc.d/init.dкаталогу, но там не нашел ничего связанного с определениями цвета.

Есть ли такое определение уже на месте? Если нет, я бы положил их в файл, /etc/rc.d/init.dскажем, и включил бы его в мои сценарии, немного как с/etc/rc.d/init.d/functions

fduff
источник
Это не так, потому что \e[1;30m, например, технически не представляет серый, а скорее слот цвета, обычно отображаемый терминалом как серый. Эмуляторы терминалов могут свободно изменять фактические цвета дисплея и часто делают их настраиваемыми пользователем.
Чепнер

Ответы:

36

В том, что вы спрашиваете, есть несколько аспектов.

Во-первых, bash не определяет цвета. На самом деле Bash не имеет ни малейшего представления, что цвета вообще существуют. Все, что он знает, это то, что вы сказали ему выводить символы \033[0;36m. Ваш эмулятор терминала (xterm, gnome-терминал, что угодно) получает эти символы и понимает: «Мне нужно начать вывод в cyan».

Таким образом, ваш эмулятор терминала понимает цвета. Ваш эмулятор терминала понимает, что \033[0;36mэто голубой, но другой эмулятор терминала может использовать совершенно другой набор символов для голубого (хотя никакой нормальный эмулятор терминала не выставит напоказ стандарт и сделает это). Это причина для tput. Когда вы запустите tput setaf 6, tputон будет искать коды выхода вашего терминала для цвета 6 (голубой) и выводить этот код перехода.
(см. этот вопрос для получения дополнительной информации о tput setafкодах)

Теперь вернемся к Bash. Как вы могли заметить, когда я имел в виду голубой цвет, я использовал \033[0;36m, а не \[\033[0;36m\]. Квадратные скобки отсутствуют. Назначение квадратных скобок состоит в том, что при использовании escape-кодов (цветов) в приглашении bash должен знать, какие символы не печатаются (нулевой ширины, фактически ничего не показывает). Таким образом вы заключаете непечатаемые символы в \[ \]. Если вы удалите эти символы, на первый взгляд все может работать нормально, но вы начнете сталкиваться со всевозможными странностями, когда ваша команда превысит ширину терминала. Это связано с тем, что при вводе команды bash должен знать, когда команда должна перейти на следующую строку. Для этого он вычисляет ширину приглашения, а затем ширину того, сколько вы набрали.

Еще одна заметка, о tput. CYAN="\[\033[0;36m\]"это не то же самое, что CYAN="$(tput setaf 6)". Как мы только что обсуждали, квадратные скобки относятся к bash и tputсобираются выводить только коды выхода терминала.

Поскольку квадратные скобки обычно имеют отношение только к приглашению, если вы используете цвета в выводе скрипта или чего-то еще, вы не должны их использовать. Это означает, что если вы собираетесь использовать цвета не только для подсказок, вам нужно определить несколько переменных. Один с квадратными скобками для использования в подсказке, а другой без всего остального. Хотя вы можете просто добавлять квадратные скобки вручную каждый раз, когда ссылаетесь на цвет в приглашении.

Короче говоря, вы, вероятно, хотите определить что-то вроде:

local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"
Патрик
источник
Как тогда я вижу цвета при входе в реальный терминал с Ctrl+ Alt+ F1?
Серж Строобандт