Читать «Командная строка Linux» онлайн
Шоттс Уильям
Страница 38 из 113
Цветом символов можно управлять, посылая эмулятору терминала экранированные последовательности ANSI внутри потока символов, предназначенных для вывода на экран. Экранированные последовательности не «выводятся» на экран; они интерпретируются терминалом как инструкции. Как показано в табл. 13.1, для включения непечатаемых символов используются последовательности \[ и \]. Экранированные последовательности ANSI начинаются с восьмеричного кода 033 (код, генерируемый клавишей ESC), за которым следует необязательный атрибут символа и инструкция. Например, вот как выглядит код, определяющий текст как простой (атрибут = 0), черного цвета \033[0;30m.
В табл. 13.2 перечислены поддерживаемые цвета текста. Обратите внимание, что цвета делятся на две группы, отличаясь наличием атрибута жирного текста (1), из-за которого возникает впечатление более «светлых» (light) цветов.
Таблица 13.2. Экранированные последовательности, используемые для определения цвета текста
Последовательность
Цвет
\033[0;30m
Черный
\033[0;31m
Красный
\033[0;32m
Зеленый
\033[0;33m
Коричневый
\033[0;34m
Синий
\033[0;35m
Пурпурный
\033[0;36m
Бирюзовый
\033[0;37m
Светло-серый
\033[1;30m
Темно-серый
\033[1;31m
Светло-красный
\033[1;32m
Светло-зеленый
\033[1;33m
Желтый
\033[1;34m
Светло-синий
\033[1;35m
Светло-пурпурный
\033[1;36m
Светло-бирюзовый
\033[1;37m
Белый
Давайте попробуем окрасить строку приглашения в красный цвет (здесь она выглядит как серая). Добавьте в начало экранированную последовательность:
<[email protected] ~>$ PS1="\[\033[0;31m\]<\[email protected]\h \W>\$ "
<[email protected] ~>$
Получилось, но обратите внимание, что весь текст, который вводится с клавиатуры вслед за строкой приглашения, также окрашивается в красный цвет. Для устранения этого эффекта добавьте еще одну экранированную последовательность в конец определения приглашения — этим вы сообщите эмулятору терминала, что тот должен восстановить нормальный цвет:
<[email protected] ~>$ PS1="\[\033[0;31m\]<\[email protected]\h \W>\$\[\033[0m\] "
<[email protected] ~>$
Так лучше!
Кроме того, существует возможность изменить цвет фона, для чего предназначены экранированные последовательности, перечисленные в табл. 13.3. Цвет фона не поддерживает атрибут жирного текста.
Таблица 13.3. Экранированные последовательности, используемые для определения цвета фона
Последовательность
Цвет
\033[0;40m
Черный
\033[0;41m
Красный
\033[0;42m
Зеленый
\033[0;43m
Коричневый
\033[0;44m
Синий
\033[0;45m
Пурпурный
\033[0;46m
Бирюзовый
\033[0;47m
Светло-серый
Чтобы вывести приглашение на красном фоне, достаточно изменить первую экранированную последовательность:
<[email protected] ~>$ PS1="\[\033[0;41m\]<\[email protected]\h \W>\$\[\033[0m\] "
<[email protected] ~>$
Попробуйте другие цвета и посмотрите, что из этого получится!
ПРИМЕЧАНИЕ
Помимо атрибутов символов нормального (0) и жирного (1) текста, есть также атрибут подчеркивания (4), мигания (5) и инверсии (7). В целях воспитания хорошего вкуса многие эмуляторы терминалов не поддерживают атрибут мигания.
Перемещение курсора
Экранированные последовательности можно использовать для позиционирования курсора. Этот прием часто используется для отображения времени или другой информации в разных местах на экране, например вверху, при каждом выводе приглашения к вводу. В табл. 13.4 перечислены экранированные последовательности, управляющие позицией курсора.
Таблица 13.4. Экранированные последовательности, управляющие позицией курсора
Последовательность
Действие
\033[l;cH
Перемещает курсор в строку l и позицию c
\033[nA
Перемещает курсор вверх на n строк
\033[nB
Перемещает курсор вниз на n строк
\033[nC
Перемещает курсор вперед на n символов
\033[nD
Перемещает курсор назад на n символов
\033[2J
Очищает экран и помещает курсор в левый верхний угол (строка 0, позиция 0)
\033[K
Очищает экран от позиции курсора до конца текущей строки
\033[s
Сохраняет текущую позицию курсора
\033[u
Восстанавливает сохраненную позицию курсора
Используя эти коды, можно сконструировать строку приглашения, рисующую красный прямоугольник с часами в верхней части экрана (время отображается желтым цветом). Код, определяющий строку приглашения, на этот раз выглядит немного устрашающе:
PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\[email protected]\h \W>\$ "
В табл. 13.5 приведены отдельные части этого определения, они помогут понять, как это работает.
Таблица 13.5. Экранированные последовательности, управляющие позицией курсора
Последовательность
Действие
\[
Начинает последовательность непечатаемых символов. Истинное назначение этой последовательности — позволить bash правильно вычислить длину строки приглашения на экране. Без этого функция редактирования командной строки неправильно позиционировала бы курсор
\033[s
Сохраняет позицию курсора. Это необходимо, чтобы вернуться в местоположение строки приглашения после вывода прямоугольника с часами в верхней части экрана. Будьте внимательны: некоторые эмуляторы терминалов не поддерживают эту последовательность
\033[0;0H
Перемещает курсор в левый верхний угол, в строку 0, позицию 0
\033[0;41m
Устанавливает красный цвет фона
\033[K
Очищает экран от текущей позиции курсора (в левом верхнем углу) до конца строки. Поскольку теперь установлен красный цвет фона, строка окрашивается в красный цвет. Обратите внимание, что последовательность очистки экрана до конца строки не изменяет позицию курсора, который остается в левом верхнем углу
\033[1;33m
Устанавливает желтый цвет текста
\t
Выводит текущее время. Хотя это «печатаемый» элемент, он находится в непечатаемом блоке строки приглашения, потому что нам не нужно, чтобы командная оболочка bash учитывала размер часов при расчете истинного размера отображаемой строки приглашения
\033[0m
Выключает цвет. Сбрасывает настройки цвета для текста и фона
\033[u
Восстанавливает позицию курсора, сохраненную ранее
\]
Завершает последовательность непечатаемых символов
<\[email protected]\h \W>\$
Строка приглашения
Сохранение определения приглашения
Я думаю, что мало у кого возникло желание вводить это монструозное определение каждый раз, поэтому нам нужно где-то сохранить строку приглашения. Сохранить определение можно в файле .bashrc. Для этого добавьте следующие две строки в файл:
PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\[email protected]\h \W>\$ "
export PS1
Заключительное замечание
Хотите — верьте, хотите — нет, но со строкой приглашения можно творить чудеса, задействовав функции и сценарии, которые мы пока не рассматривали. Все, что было описано выше, — хорошее начало. Не все захотят возиться с изменением приглашения к вводу, оформление по умолчанию тоже выглядит неплохо. Но тем из вас, кому нравится копаться в мелочах, командная оболочка предоставляет возможность творчески провести несколько часов.
Часть III. Типичные задачи и основные инструменты
14. Управление пакетами