Введение
Иногда в терминале вынужден возвращаться к выводу ранее запущенных команд и довольно сложно разглядеть приглашение командной строки в символах одинакового цвета. Конечно, можно повторить команду и послать её в канал (pipe) с less или more, но всё же хотелось бы чтоб строка приглашения как-то выделялась среди всех других в терминале, даже просто из эстетических соображений. Неплохо бы использовать цвета в качестве разделителя?
Переменные среды строки приглашения
За строку приглашения отвечают такие переменные среды, как PS1, PS2, PS3, PS4 и PROMPT_COMMAND.
- PS1 — переменная, которая задает вид строки приглашения командной строки, которое bash выводит, когда ожидает ввода очередной команды пользователем.
- PS2 — переменная, отвечающая за вторичный тип приглашения ввода.
- PS3 — третичное приглашение, выводится тогда, когда пользователь должен сделать выбор в операторе select.
- PS4 — приглашение четвертого уровня, выводится при отладки сценариев (скриптов) в начале каждой строки перед командой перед исполняющейся командой.
- PROMPT_COMMAND — содержимое этой переменной выполняется перед каждой строкой приглашения.
Значение каждой переменной можно узнать, введя в терминале:
$ echo $имя_переменной
К примеру, узнать значение переменной PS1:
Изменить значение переменной можно двумя способами.
Способ первый — указать значение непосредственно в терминале с помощью команды export:
$ export имя_переменной=’значение’
К примеру, указать значение переменной PS1:
Способ второй — с помощью вашего любимого редактора дописать в .bashrc требуемые значения:
gedit ~/.bashrc
И в конце файла добавляем требуемые значения:
PS1=’\u\w\$ ‘
Все значения нужно заключать в кавычки, одинарные или двойные не имеет значение, но ОБЯЗАТЕЛЬНО заключать!
Файл конфигурации Bash
Как уже было сказано выше, есть два способа указать значение переменных и есть разница между этими способами. При указании непосредственно в терминале изменения вступят в силу незамедлительно и будут действительны только в данной сессии. При изменении в файле конфигураций вступят в силу только при следующей сессии терминала, но действительны будут и в последующих сессиях. Так что экспериментируйте с командой экспорт, а понравившейся результат занесите в файл конфигурации.
По умолчанию строка приглашения в терминале в Ubuntu для обычного пользователя имеет следующий формат:
имя_пользователя@имя_хоста:текущий_каталог$
Для суперпользователя (root) уже другой:
root@имя_хоста:текущий_каталог#
Чтобы изменить строку приглашения обычного пользователя, указать новое значение переменных нужно в файле конфигурации в домашнем каталоге ~/.bashrc, а для root в файле /root/.bashrc. Для этого откройте свой любимый текстовый редактор и добавьте нужные значения.
К делу
У меня строка приглашения по умолчанию выглядит так:
Вид этого приглашения можно задать в переменной PS1.
Для указания значений этой переменной используется специальный формат из управляющих последовательностей и обычного текста. Специальные управляющие последовательности упрощают настройку внешнего вида приглашения командной строки.
К примеру, следующая последовательность \$ заставляет Bash отображать знак доллара ($), когда пользователь является обычным пользователем системы, но заменяет знак доллара решеткой (#), когда пользователь является суперпользователем (root).
Каждая специальная последовательность начинается с обратной косой черты (backslash) — «\».
К примеру, последовательность \u указывает, что надо отобразить имя пользователя, \h — имя хоста, \w — текущую папку.
Теперь объединим всё, чтобы получить приглашение примером выше:
PS1=’\u@\h:\w\$ ‘
Знак «собаки» (@) и двоеточия не предварёны обратной косой чертой (\), поэтому они выводятся на экран как есть. Конец строки заканчивается символом пробела, чтобы набираемый в командной строке текст отделялся от приглашения командной строки.
Наиболее популярны следующие управляющие последовательности:
******************* Печатные символы *********************************
\d Дата в формате «День, месяц, число», например, Срд, Окт, 17.
\h Имя хоста (hostname) до первой точки
\H Полное имя хоста
\t Текущее время в 24-часовом формате: HH:MM:SS (часы:минуты:секунды)
\T Текущее время в 12-часовом формате: HH:MM:SS
\@ Текущее время в 12-часовом формате am/pm
\u Имя пользователя, запустившего оболочку
\w Полное имя текущего рабочего каталога (начиная с корня)
\W Текущий рабочий каталог (без указания пути)
\$ Символ #, если оболочка запущена суперпользователем, и символ $, если оболочка запущена обычным пользователем.
\n Новая строка (перевод строки)
\s Имя оболочки
\# Текущий номер команды
\! Порядковый номер данной команды в истории команд
\\ Обратный слэш (a backslash)
******************* Непечатные символы *******************************
\nnn Непечатный символ, имеющий восьмеричный код nnn (к примеру esc)
\a Звуковой сигнал (ASCII-код 007)
\e escape (ASCII-код 033)
\[ Начало последовательности не печатаемых символов (этот символ может быть использован для того, чтобы включить в текст подсказки последовательность управляющих символов терминала)
\] Конец последовательности не печатаемых символов
Знание этих последовательностей помогает понять, каким образом модифицировать приглашение командной строки.
Например, установка переменой PS1='[\A]\u@\h:\w\$ ‘ заменяет, скажем, на такое значение:
С помощью специальных непечатаемых последовательностей можно изменить цвет приглашения командной строки, что выделит его из обычного текста. Чтобы показать, что вводится значение цвета, необходимо ввести управляющую ASCII-последовательность \e (или восьмеричный ASCII-кодом \033 ).
Одна и проблем, которая возникает при использовании не печатных последовательностей, заключается в том, что Bash вычисляет количество символов в приглашении командной строки и использует это число для размещения текста в терминальном окне. Так как коды цветов не выводятся на экран, то они мешают корректному подсчету. Чтобы предотвратить подсчет непечатаемых символов, управляющие последовательности необходимо заключать в управляющие скобки \[ и \]. Для того что бы лучше понять, предлагаю испробовать оба варианта: со скобками и без оных и посмотреть разницу.
Изменению в командной строке поддаётся не только текст, но и фон, поэтому формат цвета можно указать двумя способами — для фона и цвета текста или только для текста.
Формат последовательности для фона и цвета :
\[\е[#;##;#;##m\]
Формат последовательности только для текста :
\[\е[#;##m\]
Где # — специальный номер свойства цвета, а ## — специальный номер цвета. Свойством цвета может быть, например, повышенная или пониженная яркость. В формате для фона и цвета в начале указывается фон, а после цвет самого текста.
Свойство | Код |
Значение по умолчанию | 0 |
Повышенная яркость | 1 |
Пониженная яркость | 2 |
Подчеркнутый | 4 |
Нормальная яркость | 5 |
Инвертированный | 7 |
Скрытый | 8 |
Цвет | Текст | Фон |
Черный | 30 | 40 |
Красный | 31 | 41 |
Зеленый | 32 | 42 |
Желтый | 33 | 43 |
Синий | 34 | 44 |
Фиолетовый | 35 | 45 |
Голубой | 36 | 46 |
Белый | 37 | 47 |
Полный список кодов цветов зависит от типа используемого терминала.
Подытожим раскрасив предыдущее приглашение командной строки следующим образом — время ярко-красным цветом, имя пользователя ярко-жёлтым, имя хоста ярко фиолетовым, а текущий рабочий каталог ярко-синим цветом и в конце приглашения командной строки отметим установку цветового кода в ноль (который обозначает значение по умолчанию):
PS1=’\[\e[1;31m\][\A]\[\e[1;33m\]\u@\[\e[1;35m\]\h:\[\e[1;34m\]\w\$\[\e[0m\] ‘
Результат:
Приведу ещё один пример с использованием фона: время раскрасим черным на белом фоне, а всё остальное ярко-синим:
PS1=’\[\e[5;47;5;30m\][\A]\[\e[0;1;34m\]\u@\h:\w\$\[\e[0m\] ‘
Описание следующих переменных строки приглашения будет кратким, особо не вдаваясь в подробности, но предоставит вам представление, за что они отвечают.
Вторичная строка приглашения появляется, к примеру, когда ввод команды в первичном приглашении переносится на следующую строку. Сообщить командному интерпретаторуо том, что ввод продолжается в следующей строке, можно, введя обратную косую черту «\» в конце строки и введя Enter. По умолчанию отображается как «>». Формат этой переменной идентичен формату переменной PS1.
А вот почти тот же пример, но строка приглашения разукрашена. Более читабельно?
Этот вид приглашения используется в скриптах, когда нужно сделать выбор при использовании оператора select. Простой наглядный пример bash-скрипта и его вывод:
#!/bin/bash
# Пример третичного приглашения
# установим PS3 для выбора ответа в виде трёх знаков больше
PS3=»>>> »
echo -e «\nВаш любимый сайт ?»
select answer in «www.ubuntologia.ru» «www.microsoft.com»
do
echo -e ‘\e[37;44m’»\e[1mВаш выбор — $answer.\e[0m»
echo -e «Продолжение работы скрипта…\n»
break
done
exit 0
Приглашение четвертого уровня PS4 так же используется в скриптах. К примеру ключ -v заставляет выводить на экран терминала каждую команду прежде, чем она будет исполнена. Ключом -x подобно ключу -v, но выполняет подстановку команд и перед каждой командой выведет четверичное приглашение. Пример bash-скрипта и его вывод:
#!/bin/bash -x
# Пример третичного приглашения
PS4=’команда > ‘ # установим приглашение четвертого уровня
echo «Команда номер 1»
echo «Команда номер 2»
echo «Команда номер 3»
echo «Команда номер 4»
С помощью этой переменной можно задать выполнение определённых команд перед каждым первичным приглашением. В основном, она используется, когда нужно расширить возможности первичного приглашения, вызывая какую-то дополнительную функцию или команду или даже целый скрипт. К примеру, я хочу, чтобы перед каждым первичным приглашением происходил вывод текущего каталога и календаря на месяц:
PROMPT_COMMAND=’ls; cal’
Так как эта переменная более функциональна, ею можно заменить первичное приглашение, но при этом надо уметь писать скрипты для Bash, что выходит за рамки повествования. Для более подробной информации читайте: man bash.
Автор статьи: sKwa
Добавить комментарий