Строка приглашения в Bash

·

·

Введение

Иногда в терминале вынужден возвращаться к выводу ранее запущенных команд и довольно сложно разглядеть приглашение командной строки в символах одинакового цвета. Конечно, можно повторить команду и послать её в канал (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. Для этого откройте свой любимый текстовый редактор и добавьте нужные значения.

К делу

1. Переменная PS1

У меня строка приглашения по умолчанию выглядит так:

Вид этого приглашения можно задать в переменной 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\] ‘

skwa-ps1-colored-bg

Описание следующих переменных строки приглашения будет кратким, особо не вдаваясь в подробности, но предоставит вам представление, за что они отвечают.

2. Переменная PS2

Вторичная строка приглашения появляется, к примеру, когда ввод команды в первичном приглашении переносится на следующую строку. Сообщить командному интерпретаторуо том, что ввод продолжается в следующей строке, можно, введя обратную косую черту «\» в конце строки и введя Enter. По умолчанию отображается как «>». Формат этой переменной идентичен формату переменной PS1.

А вот почти тот же пример, но строка приглашения разукрашена. Более читабельно?

3. Переменная PS3

Этот вид приглашения используется в скриптах, когда нужно сделать выбор при использовании оператора 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

4. Переменная PS4

Приглашение четвертого уровня PS4 так же используется в скриптах. К примеру ключ -v заставляет выводить на экран терминала каждую команду прежде, чем она будет исполнена. Ключом -x подобно ключу -v, но выполняет подстановку команд и перед каждой командой выведет четверичное приглашение. Пример bash-скрипта и его вывод:

#!/bin/bash -x
# Пример третичного приглашения
PS4=’команда > ‘ # установим приглашение четвертого уровня
echo «Команда номер 1»
echo «Команда номер 2»
echo «Команда номер 3»
echo «Команда номер 4»

4.PROMPT_COMMAND

С помощью этой переменной можно задать выполнение определённых команд перед каждым первичным приглашением. В основном, она используется, когда нужно расширить возможности первичного приглашения, вызывая какую-то дополнительную функцию или команду или даже целый скрипт. К примеру, я хочу, чтобы перед каждым первичным приглашением происходил вывод текущего каталога и календаря на месяц:

PROMPT_COMMAND=’ls; cal’

Так как эта переменная более функциональна, ею можно заменить первичное приглашение, но при этом надо уметь писать скрипты для Bash, что выходит за рамки повествования. Для более подробной информации читайте: man bash.

Автор статьи: sKwa

Оригинал

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Закончите арифметическое действие * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.