Я часто использовал цвета в скриптах 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
\e[1;30m
, например, технически не представляет серый, а скорее слот цвета, обычно отображаемый терминалом как серый. Эмуляторы терминалов могут свободно изменять фактические цвета дисплея и часто делают их настраиваемыми пользователем.Ответы:
В том, что вы спрашиваете, есть несколько аспектов.
Во-первых, 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
собираются выводить только коды выхода терминала.Поскольку квадратные скобки обычно имеют отношение только к приглашению, если вы используете цвета в выводе скрипта или чего-то еще, вы не должны их использовать. Это означает, что если вы собираетесь использовать цвета не только для подсказок, вам нужно определить несколько переменных. Один с квадратными скобками для использования в подсказке, а другой без всего остального. Хотя вы можете просто добавлять квадратные скобки вручную каждый раз, когда ссылаетесь на цвет в приглашении.
Короче говоря, вы, вероятно, хотите определить что-то вроде:
источник
Ctrl
+Alt
+F1
?