User Tools

Site Tools


bash:настройка_приглашения_к_вводу

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
bash/настройка_приглашения_к_вводу.txt · Last modified: 2023/04/06 10:18 (external edit)