В том, что вы спрашиваете, есть несколько аспектов.
Во-первых, 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\]"
\e[1;30m
, например, технически не представляет серый, а скорее слот цвета, обычно отображаемый терминалом как серый. Эмуляторы терминалов могут свободно изменять фактические цвета дисплея и часто делают их настраиваемыми пользователем.