Table of Contents
bash настройка приглашения к вводу
Устройство строки приглашения к вводу
По умолчанию строка приглашения к вводу имеет следующий вид:
[user@hostname ~]$
Строка содержит имя пользователя, имя хоста (сетевое имя компьютера) и имя текущего рабочего каталога. Форма приглашения к вводу определяется в переменной окружения <html>PS1</html> (сокращенно от prompt string 1 — строка приглашения 1). Увидеть содержимое переменной <html>PS1</html> можно с помощью команды echo. Увидим приблизительно следующие
echo $PS1 [\u@\h \W]\$
<WRAP center round tip 90%> Nota Bene! Если вывод отличающееся от примера, приведенного выше, пужаться не стоит. Все дистрибутивы Linux определяют приглашение к вводу по-своему, а некоторые содержат весьма экзотические определения. </WRAP> Экранированные последовательности, используемые в строке приглашения
Символы | Отображаемое значение |
---|---|
<html>\a</html> | Звонок. Заставляет компьютер издавать звуковой сигнал |
<html>\d</html> | Текущая дата в формате: день недели месяц число; например, «Mon May 26» (Пн Май 26) |
<html>\h</html> | Имя хоста локальной машины минус имя домена |
<html>\H</html> | Полное имя хоста |
<html>\j</html> | Число заданий, действующих в текущем сеансе |
<html>\l</html> | Имя текущего устройства терминала |
<html>\n</html> | Символ перевода строки |
<html>\r</html> | Возврат каретки |
<html>\s</html> | Имя программы командной оболочки |
<html>\t</html> | Текущее время в 24-часовом формате |
<html>\T</html> | Текущее время в 12-часовом формате |
<html>\@</html> | Текущее время в 12-часовом формате AM/PM |
<html>\A</html> | Текущее время в 24-часовом формате, часы:минуты |
<html>\u</html> | Имя пользователя |
<html>\v</html> | Номер версии командной оболочки |
<html>\V</html> | Номер версии и выпуска командной оболочки |
<html>\w</html> | Имя текущего рабочего каталога |
<html>\W</html> | Последняя часть в имени текущего рабочего каталога |
<html>\!</html> | Номер текущей команды в истории |
<html>\#</html> | Число команд, введенных в текущем сеансе командной оболочки |
<html>\$</html> | Выводит символ $, если пользователь не является суперпользователем, иначе выводит символ |
<html>\[</html> | Отмечает начало последовательности из одного или более непечатаемых символов. Используется для внедрения непечатаемых символов, управляющих поведением эмулятора терминала, например, перемещает курсор или изменяет цвет текста |
<html>\]</html> | Отмечает конец последовательности непечатаемых символов |
Альтернативные варианты оформления приглашения
Имея список специальных символов, можно попробовать изменить оформление приглашения. Для начала сохраните исходное определение, чтобы его можно было восстановить позднее. Для этого скопируем значение переменной <html>PS1</html> в другую переменную:
ps1_old="$PS1"
Это позволит в любой момент восстановить исходное оформление приглашения, выполнив обратную процедуру:
PS1="$ps1_old"
Теперь, когда все готово, давайте посмотрим, что получится, если определить пустую строку приглашения:
PS1=
Если определить приглашение как пустую строку, то – ничего не увидим. Это несколько дезориентирует, так что внесем минимальное оформление.
PS1="\$ " $
Так лучше. По крайней мере, теперь видно, кто мы. Но, пользователя, под которым работаем, теперь можно только через команду whoami.
Добавим в строку приглашения сигнал:
$ PS1="\[\a\]\$ "
Теперь при каждом выводе строки приглашения, будем слышать короткий звуковой сигнал. Обратите внимание, что были добавлены последовательности <html>\[</html> и <html>\]</html>. Поскольку управляющий ASCII-символ «звонок» <html>\a</html> не является «печатаемым», то есть не перемещает курсор при выводе, мы должны сообщить об этом командной оболочке bash, чтобы та могла правильно определить длину строки приглашения.
А теперь сварганим более информативное приглашение, добавив имя хоста и время суток:
$ PS1="\A \h \$ " 09:13 user $
Наконец, сделайте приглашение похожим на оригинально
$ PS1="<\u@\h \W>\$ " <user@hostname ~>$
Добавление цвета
Большинство программ эмуляторов терминалов реагируют на некоторые последовательности непечатаемых символов, например, управляющие атрибутами символов (такими, как цвет, жирность и мигание) и позицией курсора.
Цветом символов можно управлять, посылая эмулятору терминала экранированные последовательности ANSI внутри потока символов, предназначенных для вывода на экран. Экранированные последовательности не «выводятся» на экран; они
интерпретируются терминалом как инструкции. Как показано в таблицу выше, для включения непечатаемых символов используются последовательности <html>\[</html> и <html>\]</html>. Экранированные последовательности ANSI начинаются с восьмеричного кода 033 (код, генерируемый клавишей ESC), за которым следует необязательный атрибут символа и инструкция. Например, вот как выглядит код, определяющий текст как простой (атрибут = 0), черного цвета – <html>\033[0;30m</html>
В таблице перечислены поддерживаемые цвета текста.
<WRAP center round tip 90%>
Nota Bene! Обратите внимание, что цвета делятся на две группы, отличаясь наличием атрибута жирного текста 1,
из-за которого возникает впечатление более «светлых» (light) цветов.
</WRAP>
Последовательность | Цвет | Последовательность | Цвет |
---|---|---|---|
<html>\033[0;30m</html> | Черный | <html>\033[1;30m</html> | Темно-серый |
<html>\033[0;31m</html> | Красный | <html>\033[1;31m</html> | Светло-красный |
<html>\033[0;32m</html> | Зеленый | <html>\033[1;32m</html> | Светло-зеленый |
<html>\033[0;33m</html> | Коричневый | <html>\033[1;33m</html> | Желтый |
<html>\033[0;34m</html> | Синий | <html>\033[1;34m</html> | Светло-синий |
<html>\033[0;35m</html> | Пурпурный | <html>\033[1;35m</html> | Светло-пурпурный |
<html>\033[0;36m</html> | Бирюзовый | <html>\033[1;36m</html> | Светло-бирюзовый |
<html>\033[0;37m</html> | Светло-серый | <html>\033[1;37m</html> | Белый |
Попробуем окрасить строку приглашения в красный цвет. Добавьте в начало экранированную последовательность:
<vs@v0id ~>$ PS1="\[\033[0;31m\]<\u@\h \W>\$ "
Получилось, но текст, который вводится с клавиатуры вслед за строкой приглашения, также окрашивается в красный цвет. Для устранения этого эффекта добавьте еще одну экранированную последовательность в конец определения приглашения – этим вы сообщите эмулятору терминала, что тот должен восстановить нормальный цвет:
PS1="\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\] "
Красота!
Цвет фона
Кроме того, существует возможность изменить цвет фона, для чего предназначены экранированные последовательности. Цвет фона не поддерживает атрибут жирного текста.
Последовательность | Цвет | Последовательность | Цвет |
---|---|---|---|
<html>\033[0;40m</html> | Черный | <html>\033[1;44m</html> | Синий |
<html>\033[0;41m</html> | Красный | <html>\033[1;45m</html> | Пурпурный |
<html>\033[0;42m</html> | Зеленый | <html>\033[1;46m</html> | Бирюзовый |
<html>\033[0;43m</html> | Коричневый | <html>\033[1;47m</html> | Светло-серый |
Чтобы вывести приглашение на красном фоне, достаточно изменить первую экранированную последовательность:
PS1="\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] "
Перемещение курсора
Экранированные последовательности можно использовать для позиционирования курсора. Этот прием часто используется для отображения времени или другой информации в разных местах на экране, например вверху, при каждом выводе приглашения к вводу.
Экранированные последовательности, управляющие позицией курсора
Последовательность | Действие |
---|---|
<html>\033[l;cH</html> | Перемещает курсор в строку l и позицию c |
<html>\033[nA</html> | Перемещает курсор вверх на n строк |
<html>\033[nB</html> | Перемещает курсор вниз на n строк |
<html>\033[nC</html> | Перемещает курсор вперед на n символов |
<html>\033[nD</html> | Перемещает курсор назад на n символов |
<html>\033[2J</html> | Очищает экран и помещает курсор в левый верхний угол (строка 0, позиция 0) |
<html>\033[K</html> | Очищает экран от позиции курсора до конца текущей строки |
<html>\033[s</html> | Сохраняет текущую позицию курсора |
<html>\033[u</html> | Восстанавливает сохраненную позицию курсора |
Используя эти коды, можно сконструировать строку приглашения, рисующую красный прямоугольник с часами в верхней части экрана (время отображается желтым цветом). Код, определяющий строку приглашения, на этот раз выглядит немного устрашающе:
PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ "
Ниже приведены отдельные части этого определения, которые помогут понять, как это работает.
Последовательность | Действие |
---|---|
<html>\[</html> | Начинает последовательность непечатаемых символов. Истинное назначение этой последовательности – позволить bash правильно вычислить длину строки приглашения на экране. Без этого функция редактирования командной строки неправильно позиционировала бы курсор |
<html>\033[s</html> | Сохраняет позицию курсора. Это необходимо, чтобы вернуться в местоположение строки приглашения после вывода прямоугольника с часами в верхней части экрана. Будьте внимательны: некоторые эмуляторы терминалов не поддерживают эту последовательность |
<html>\033[0;0H</html> | Перемещает курсор в левый верхний угол, в строку 0, позицию 0 |
<html>\033[0;41m</html> | Устанавливает красный цвет фона |
<html>\033[K</html> | Очищает экран от текущей позиции курсора (в левом верхнем углу) до конца строки. Поскольку теперь установлен красный цвет фона, строка окрашивается в красный цвет. Обратите внимание, что последовательность очистки экрана до конца строки не изменяет позицию курсора, который остается в левом верхнем углу |
<html>\033[1;33m</html> | Устанавливает желтый цвет текста |
<html>\t</html> | Выводит текущее время. Хотя это «печатаемый» элемент, он находится в непечатаемом блоке строки приглашения, потому что нам не нужно, чтобы командная оболочка bash учитывала размер часов при расчете истинного размера отображаемой строки приглашения |
<html>\033[0m</html> | Выключает цвет. Сбрасывает настройки цвета для текста и фона |
<html>\033[u</html> | Восстанавливает позицию курсора, сохраненную ранее |
<html>\]</html> | Завершает последовательность непечатаемых символов |
<html><\u@\h \W>\$</html> | Строка приглашения |
Сохранение определения приглашения
Для сохранения определение можно в файле <html>.bashrc</html>. Для этого добавьте следующие две строки в файл:
PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ " export PS1