Bash настроить строку приглашения

Настройка строки приглашения в bash

Строка приглашения в bash – то, что печатается в терминал до начала ввода команды. К примеру, по умолчанию у меня это выглядит как-то так:
Как видно, достаточно неприметный вид, ничем не выделяется. А значит сложный поиск введённых команд среди вывода bash. Рецепт в статье универсальный, будут работать как для Ubuntu 16.04, так и в Archlinux.

Формат задаётся с помощью глобальной переменной PS1, узнать её значение можно с помощью echo:
$ echo $PS1

Изменить её можно следующим образом (пока консоль не закроется):
$ PS1=’значение’

Либо добавив запись вида:
export PS1=’значение’
В файлы

Формат строки приглашения в bash

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

Последовательность символов, отображающих время и дату

Символы Значение
d Дата в формате: день недели, текущий месяц, число
t Время в 24-часовом формате: часы, минуты, секунды
T Время в 12-часовом формате: часы, минуты, секунды
@ Время в 12-часовом формате: часы, минуты, секунды + AM(утро) или PM(вечер)

Специальные символы, изменяющие значение в зависимости от пользователя и хоста

Символы Значение
H Полный hostname
h hostname до первой точки
u Текущий пользователь
$ Показывает $ – если оболочка запущена непривилегированным пользователем и # – root’ом
s Название оболочки терминала

Местоположение

Символы Значение
W Полный путь папки в которой происходит сеанс
w Сокращенный путь (отображается только имя текущей директории)

Прочее

Символы Значение
n Новая строка
# Номер команды
! Номер команды в истории bash’а
a Звуковой сигнал

Пример использования

Задав приглашение в виде ‘имя_хоста : время : номер команды -:’
PS1=’H : t : # -:’
Увидим примерно это:
ozi-linux : 08:55:35 : 8 -:

Изменение цвета символов

Цвет букв или фона меняется с помощью такой последовательности:
[е[K;Nm] Где K – номер свойства, N – номер цвета букв или фона, в зависимости от значения.

Свойства цвета и их численное обозначение

Свойство K
По-умолчанию 0
Яркий 1
Тусклый 2
Подчеркнутый 4
Обычный 5
Инвентированный 7
Скрытый 8
Цвет N для символов N для фона
Чёрный 30 40
Красный 31 41
Зелёный 32 42
Жёлтый 33 43
Синий 34 44
Фиолетовый 35 45
Голубой 36 46
Белый 37 47

Пример использования

[е[1;47m][е[2;35m]
Эта последовательность задаёт яркий(1) белый фон(47) и тусклые(2) фиолетовые символы(35) для последующего вывода.

Заключение

Немного подумав, я выбрал такой формат:
PS1='[e[1;31m]u[e[0;32m]:[e[0;35m]w[e[0;32m]$ [e[0;37m]’
С пояснениями (переключение цвета показано окраской последовательности):

А выглядит это вот так:

Возможно выглядит это не особо эстетично, но главное – заметно. Что меня полностью и устраивает =)

Читайте также:  Как настроить аддон tidy plates

Источник

Bash (Русский)/Prompt customization (Русский)

В Bash существует несколько приглашений командной строки, каждое из которых можно настроить на основе личных представлений об удобстве и эстетичности.

Contents

Приглашения

Bash имеет четыре строки приглашения, каждая из которых может быть настроена.

  • PS1 — основное приглашение, которое отображается перед каждой командой; по этой причине модифицируется чаще всего.
  • PS2 — второе приглашение, отображается, если команде требуются дополнительные данные для ввода (например, в случае многострочных команд).
  • PS3 — используется довольно редко. Отображается при работе встроенной команды Bash select , выводящей интерактивное меню. В отличие от остальных приглашений, не раскрывает escape-последовательности Bash. Обычно все изменения применяются непосредственно в скрипте, содержащем select , а не в файле .bashrc .
  • PS4 — также используется редко. При отладке скриптов показывает уровни вложенности — первый символ приглашения повторяется столько раз, сколько на данный момент задействовано уровней.

Настройка конкретного приглашения подразумевает присваивание (обычно в файле

/.bashrc ) необходимой строки в переменную, например:

Техники

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

Escape-последовательности Bash

При выводе строки приглашения Bash ищет экранированные символом слэша символы (escape-последовательности) и конвертирует их в специальные строки. Например, \u превратится в имя пользователя, а \A — в текущее время. Таким образом, если переменной PS1 присвоить ‘\A \u $ ‘ , то приглашение будет выглядеть как 17:35 пользователь $ .

Полный список escape-последовательностей можно найти в руководстве bash(1) § PROMPTING и в справочнике Bash.

Escape-последовательности terminfo

Помимо escape-последовательностей, которые понимает Bash, большинство терминалов также распознают специальные последовательности, которые влияют на терминал сам по себе, а не на печатаемые символы. Например, так можно изменить цвет строки символов, сдвинуть курсор в произвольную позицию или очистить экран. Эти последовательности могут быть довольно неудобными и варьируются от терминала к терминалу, поэтому они задокументированы в базе данных terminfo. Чтобы увидеть, какие свойства поддерживает ваш терминал, выполните:

Значение свойств можно найти в terminfo(5) по их названиям (часть перед =). Например, свойство setaf настраивает цвет шрифта для всего текста, который будет напечатан после него. Узнать escape-код свойства можно командой tput . Например,

выведет escape-последовательности для настройки зелёного цвета шрифта.

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

Escape-последовательности ANSI

К сожалению, ANSI-последовательности могут отсутствовать в базе terminfo вашего терминала. Чаще всего это касается последовательностей для новейших возможностей вроде поддержки 256 цветов. В этом случае использовать tput не получится и придётся вводить escape-последовательности вручную.

Примеры escape-последовательностей можно найти в статье Управляющие последовательности ANSI. Каждая последовательность начинается с литерала escape-последовательности, которую вы можете ввести с помощью escape-последовательности Bash \e . Например, \e[48;5;209m задаст персиковый цвет фона (если есть поддержка 256 цветов), а \e[2;2H сдвинет курсор в левый верхний угол экрана.

Читайте также:  Сломалась турбина признаки неисправности

В случаях, когда escape-последовательности Bash не поддерживаются (как в приглашении PS3), их можно добавить командой printf:

Встроенные команды

Если вы хотите добавить вывод какой-нибудь команды в приглашение, то используйте подстановку команд (command substitution). Например, чтобы добавить величину свободной памяти к приглашению попробуйте что-то вроде:

Как видно, это работает не совсем корректно — значение памяти всегда одно и то же! Причина — команда выполняется только один раз при первой настройке PS1. Необходимо предотвратить подстановку либо экранированием символа $ , либо определением строки в одиночных кавычках — в обоих случаях подстановка будет производиться каждый раз при настоящем отображении приглашения:

Если команды сделали приглашение слишком длинным, для лучшей читабельности можно вынести их в функцию:

PROMPT_COMMAND

Переменной PROMPT_COMMAND можно присвоить произвольную команду, которая будет выполняться непосредственно перед выводом PS1. Это позволяет создавать довольно мощные эффекты. Например, можно переназначить PS1 на основе некоторых условий, или выполнить какие-то действия с историей Bash при выполнении любой команды.

Escape-последовательности между вводом и выводом

Свойства вводимого текста можно изменить, «забыв» отключить свойства в конце PS1. Например, если вставить tput blink в конец PS1, то вводимые команды будут мерцать. Тем не менее, этот эффект также перейдёт и на вывод команды, поскольку свойства не отключаются при нажатии Enter .

Чтобы вставить escape-последовательность после ввода, но перед началом вывода, можно перехватить (trap) Bash-сигнал DEBUG, который посылается перед выполнением каждой команды:

Настройка приглашения root

Для удобства можно сделать приглашение командной строки root-пользователя визуально отличным от обычного (возможно, мерцающий красный цвет?). Настройка приглашения производится как обычно, но в домашнем каталоге суперпользователя, /root . Начните с копирования шаблонов /etc/skel/.bash_profile и /etc/skel/.bashrc в каталог /root , после чего внесите в файл /root/.bashrc необходимые изменения.

Примеры

Цвета

Увидеть все цвета вашего терминала можно с помощью простого цикла (замените setab на setaf , если нужен цвет текста, а не фона):

Если это не работает (причём установлено правильное значение TERM), протестируйте вручную разные последовательности:

Аналогичные значения для текста (не фона): стандартные — 30..37 , высокая интенсивность — 90..97 , а для 256 цветов замените 48 на 38.

Основные свойства

Следующие свойства terminfo будут полезны при настройке приглашения и поддерживаются во многих терминалах. #1 и #2 необходимо заменить на числовые аргументы.

Свойство Escape-последовательность Описание
Свойства текста
blink \E[5m мерцающий тект вкл
bold \E[1m полужирный текст вкл
dim \E[2m тусклый текст вкл
rev \E[7m обратное отображение вкл (текст/фон меняются цветами)
sitm \E[3m курсив вкл
ritm \E[23m курсив выкл
smso \E[7m выделение текста вкл
rmso \E[27m выделение текста выкл
smul \E[4m подчёркивание вкл
rmul \E[24m подчёркивание выкл
setab #1 \E[4#1m задать цвет фона #1 (0-7)
setaf #1 \E[3#1m задать цвет текста #1 (0-7)
sgr0 \E(B\E[m отключить все атрибуты текста
Перемещение курсора
sc \E7 сохранить позицию курсора
rc \E8 вернуть курсор в сохранённую позицию
clear \E[H\E[2J очистить экран и переместить курсор в левый верхний угол
cuu #1 \E[#1A переместить курсор вверх на #1 строк
cud #1 \E[#1B переместить курсор вниз #1 строк
cuf #1 \E[#1C переместить курсор вправо #1 столбцов
cub #1 \E[#1D переместить курсор влево #1 столбцов
home \E[H переместить курсор в левый верхний угол окна
hpa #1 \E[#1G переместить курсор в столбец #1
vpa #1 \E[#1d переместить курсор в строку #1, первый столбец
cup #1 #2 \E[#1;#2H переместить курсор в строку #1, столбец #2
Удаление символов
dch #1 \E#1P удалить #1 символов (аналогично нажатию клавиши backspace)
dl #1 \E#1M удалить #1 строк
ech #1 \E#1X стереть #1 символов (без перемещения курсора)
ed \E[J очистить до нижнего края экрана
el \E[K очистить до конца строки
el1 \E[1K очистить до начала строки
Читайте также:  Настроить jablotron пишет f

Отображение кода выхода

Тем же приёмом, как в случае встроенных команд, можно отложить интерполяцию специальной переменной Bash вроде $? . Следующие приглашения будут содержать код выхода предыдущей команды:

Это можно сделать с помощью условных выражений и функций:

Позиционирование курсора

Курсор можно перемещать по экрану во время нахождения «внутри» приглашения PS1, чтобы разные части приглашения появлялись в разных местах. Важный момент — после всех перемещений и вывода символов в любых местах экрана курсор необходимо вернуть в исходную позицию. Это можно сделать с помощью свойств sc и rc , которые сохраняют и восстанавливают позицию курсора соответственно. Общая схема приглашения, содержащего перемещения курсора:

Весь блок с перемещениями курсора обёрнут в \[ \] , чтобы Bash не учитывал непечатаемые символы как часть приглашения.

Выравнивание по правому краю

Простейший способ напечатать текст у правого края экрана — использовать printf:

Здесь задано поле %*s переменной длины с выравниванием по правому краю. Размер поля равен текущему количеству столбцов в терминале ( $COLUMNS ).

Произвольное позиционирование

Свойство cup перемещает курсор в конкретную позицию экрана, например, tput cup 20 5 переместит курсор на строку 20, столбец 5 (координаты 0 0 обозначают верхний левый угол). cuu , cud , cuf и cub (вверх, вниз, вперёд, назад) перемещают курсор относительно текущей позиции. Например, tput cuf 10 переместит курсор на 10 символов вправо. В аргументах можно использовать переменные LINES и COLUMNS , если требуется переместить курсор относительно нижнего и правого краёв окна. Например, перемещение на 10 строк и 5 столбцов от правого нижнего угла:

Настройка названия окна терминала

Название окна терминала можно настроить так же, как и приглашение: выводом escape-последовательностей в оболочке. Часто пользователи встраивают настройки названия окна в своё приглашение. Технически это возможность xterm, но и другие современные терминалы её поддерживают. В этом случае используют последовательности ESC]2;новое названиеBEL , где ESC и BEL — символы escape (выход) и bell (сигнал). С последовательностями Bash приглашение с встроенным названием окна будет иметь вид:

Само собой, строка названия окна может включать вывод встроенных команд или переменные вроде $PWD , так что она может перенастраиваться после каждой команды.

Источник

Оцените статью