Есть несколько аспектов в пьесе в том, что вы спрашиваете.
Во-первых, Bash не определяет цвета. На самом деле Bash абсолютно понятия не имеет, что цвета даже существуют. Все, что он знает, это то, что вы сказали ему выводить символы \ 033 [0; 36 м
. Ваш эмулятор терминала (xterm, gnome-terminal, что угодно) принимает эти персонажи и понимает: «Мне нужно начать выводить на Cyan».
Таким образом, это ваш эмулятор терминала, который понимает цвета. Ваш эмулятор терминала понимает, что \ 033 [0; 36m
y Cyan, но другой эмулятор терминала может использовать совершенно другой набор символов для Cyan (хотя ни один эмулятор терминала Sane не будет охвачен стандартом и сделать это). Это причина TPUTPUT
. При запуске Tutput Setaf 6
, TPUTUT
будет отображать коды Escape вашего терминала для цвета 6 (Cyan) и выведите этот код Escape.
(см. Этот вопрос для получения дополнительной информации на TPUTPTAF
кодов)
Теперь обратно в Bash. Как вы, возможно, заметили, когда я имею в виду Cyan Color, я использовал \ 033 [0; 36M
, а не \ [\ 033 [0; 36m \]
. Квадратные скобки отсутствовали. Цель квадратных скобок заключается в том, что при использовании кодов Escape (цвета) в подсказке Bash должен знать, какие символы непечатают (нулю шириной, на самом деле ничего не показывают). Таким образом, вы прилагаете непечатанные символы в \ [
\]
. Если вы удалите эти символы, все, по-видимому, сначала все отлично работает, но вы начнете работать во всевозможные странности, когда ваша команда превышает ширину клеммы. Это потому, что при наборе печати Bash должен знать, когда команда должна обернуть к следующей строке. Для этого он рассчитывает ширину подсказки, а затем ширина того, насколько вы набрали.
Другое примечание относительно TPUTPUT
. Cyan = "\ \ \ 033 [0; 36m \]"
не то же самое, что и Cyan = «$ (Tutput Setaf 6)»
. Как мы только что обсуждали, квадратные скобки актуальны к Bash, а TPUTPUT
вывод только для вывода кодов Escape Terminal.
Поскольку квадратные скобки обычно актуальны только в подсказке, если вы используете цвета в выходе сценария или что-то, вы не должны их использовать. Это означает, что если вы собираетесь использовать цвета для более чем подсказки, вам нужно определить несколько переменных. Один с квадратными скобками для использования в подсказке, и один без всего остального. Хотя вы могли бы просто вручную добавить квадратные скобки каждый раз, когда вы ссылаетесь в подсказке.
Так что длинная история короткая, вы, вероятно, хотите определить что-то вроде:
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\]"