Чи визначені кінцеві послідовності кольорових кольорів для башма?


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`

Я grep'ed навколо /etc/rc.d/init.dкаталогу, але там не знайшов нічого, пов'язаного з визначеннями кольорів.

Чи існує таке визначення вже? Якщо ні, я б поставив їх у файл, /etc/rc.d/init.dнаприклад, і включив би його до моїх сценаріїв, трохи як у/etc/rc.d/init.d/functions


Вони не є, тому що \e[1;30m, наприклад, технічно не представляє сірого, а скоріше кольоровий проріз, який зазвичай відображається терміналом як сірий. Емулятори терміналів можуть змінювати фактичні кольори дисплея, і часто роблять їх можливим для налаштування користувачем.
чепнер

Відповіді:


36

У вашому питанні є кілька аспектів.

По-перше, 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\]"

Як тоді я бачу кольори під час входу в реальний термінал за допомогою Ctrl+ Alt+ F1?
Серж Стротобандт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.