У вашому питанні є кілька аспектів.
По-перше, bash не визначає кольори. Насправді баш абсолютно не має уявлення про те, що кольори навіть існують. Все, що він знає, це те, що ти сказав йому виводити символів \033[0;36m
. Ваш емулятор терміналу (xterm, gnome-terminal, що завгодно) отримує ці символи і розуміє "мені потрібно почати виводити циан".
Таким чином, ваш термінальний емулятор розуміє кольори. Ваш емулятор термінала розуміє, що \033[0;36m
це блакитний колір, але інший емулятор терміналу може використовувати зовсім інший набір символів для cyan (хоча жоден розумний емулятор терміналу не буде виставляти параметри стандарту і робити це). Це є причиною tput
. При запуску tput setaf 6
, tput
буде шукати коди евакуації вашого терміналу, для кольору 6 (блакитного кольору), і висновок , що код втечі.
(див. це питання для отримання додаткової інформації про tput setaf
коди)
Тепер повернемося до баш. Як ви могли помітити, коли я мав на увазі блакитний колір, я користувався \033[0;36m
, ні \[\033[0;36m\]
. Квадратні дужки відсутні. Мета квадратних дужок полягає в тому, що при використанні кодів (кольорів) в підказці баш повинен знати, які символи не друкуються (нульова ширина, насправді нічого не показувати). Таким чином, ви додаєте символи, що не друкуються \[
\]
. Якщо ви видалите ці символи, спочатку все може спрацювати нормально, але ви почнете стикатися з усілякими дивацтвами, коли ваша команда перевищить ширину терміналу. Це тому, що під час набору тексту, 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
, наприклад, технічно не представляє сірого, а скоріше кольоровий проріз, який зазвичай відображається терміналом як сірий. Емулятори терміналів можуть змінювати фактичні кольори дисплея, і часто роблять їх можливим для налаштування користувачем.