- Bash (Русский)/Prompt customization (Русский)
- Contents
- Приглашения
- Техники
- Escape-последовательности Bash
- Escape-последовательности terminfo
- Escape-последовательности ANSI
- Встроенные команды
- PROMPT_COMMAND
- Escape-последовательности между вводом и выводом
- Настройка приглашения root
- Примеры
- Цвета
- Основные свойства
- Отображение кода выхода
- Позиционирование курсора
- Выравнивание по правому краю
- Произвольное позиционирование
- Настройка названия окна терминала
- Esc последовательности терминала linux
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 | очистить до начала строки |
Отображение кода выхода
Тем же приёмом, как в случае встроенных команд, можно отложить интерполяцию специальной переменной 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 , так что она может перенастраиваться после каждой команды.
Источник
Esc последовательности терминала linux
Многие компьютерные терминалы поддерживают специальные кодовые последовательности для управления цветом текста и положением курсора (позиции вывода текста) на экране. Это так называемые escape sequences, ESC-последовательности. Один из таких стандартов обычно называют ANSI Colour. Несколько спецификаций терминалов основаны на стандарте ANSI colour, включая VT100.
Ниже приведен частичный список набора команд VT100.
Примечание: здесь *ESC* в тексте команды (столбец «Коды») таблиц представляет ASCII-символ «escape», шестнадцатеричный код которого равен 0x1B (десятичное значение 27). Части команд, взятые в фигурные скобки, представляют модифицируемые параметры. Например, текст
Device Status. Следующие коды используют для вывода настроек терминала/дисплея, и результат их работы сильно зависит от конкретной реализации терминала (его эмулятора).
Функция | Коды | Описание |
Query Device Code | *ESC*[c | Запрашивает от устройства терминала отчет с кодом устройства (Report Device Code). |
Report Device Code | *ESC*[0c | Генерируется устройством в ответ на запрос Query Device Code. |
Query Device Status | *ESC*[5n | Запрашивает ответ Report Device Status от устройства. |
Report Device OK | *ESC*[0n | Генерируется устройством в ответ на запрос Query Device Status; показывает, что устройство функционирует корректно. |
Report Device Failure | *ESC*[3n | Генерируется устройством в ответ на запрос Query Device Status; показывает, что есть проблемы в функционировании устройства. |
Query Cursor Position | *ESC*[6n | Запрашивает отчет о позиции курсора (Report Cursor Position) от устройства. |
Report Cursor Position | *ESC*[ | Генерируется устройством в ответ на запрос Query Cursor Position; сообщает о текущей позиции курсора. |
Terminal Setup. Коды h и l используются для установки режима терминала/дисплея, и их функционирование зависит от реализации терминала. Настройка обрезки строки с переходом на следующую строку (Line Wrap) это один из нескольких кодов настройки, которые часто используются:
Функция | Коды | Описание |
Reset Device | *ESC*c | Сброс всех настроек терминала в значения по умолчанию. |
Enable Line Wrap | *ESC*[7h | Разрешение перехода на следующую строку: позиция вывода автоматически перескакивает на следующую строку, если она оказывается длиннее области отображения дисплея. |
Disable Line Wrap | *ESC*[7l | Запрет перехода на следующую строку, если позиция вывода оказывается за пределами правого края экрана. |
Шрифты. Некоторые терминалы поддерживают несколько шрифтов: normal/bold (обычный/толстый), swiss/italic (швейцарский/наклонный), и т. д. Имеется несколько разных специальных кодов для определенных терминалов; следующие обычно считаются стандартными:
Функция | Коды | Описание |
Font Set G0 | *ESC*( | Установить шрифт по умолчанию. |
Font Set G1 | *ESC*) | Установить альтернативный шрифт. |
Cursor Control. Управление положением курсора (позиции вывода текста) на экране - ИМХО, это наиболее интересная возможность, которая позволяет реализовать полноэкранный интерфейс управления. В частности, широко известный менеджер файлов Midnight Commander было бы невозможно реализовать, если бы не было функции Cursor Control.
Функция | Коды | Описание |
Cursor Home | *ESC*[ | Устанавливает текущую позицию курсора, откуда будет начинаться последующий вывод текста. Если не предоставлены параметры row/column (строка/столбец), например *ESC*[H, то курсор переместится "домой", т. е. в левую верхнюю позицию экрана (позиция 0,0). |
Cursor Up | *ESC*[ | Переместит курсор вверх на COUNT строк; по умолчанию (если количество строк не задано) переместит на 1 строку. |
Cursor Down | *ESC*[ | Переместит курсор вниз на COUNT строк; по умолчанию (если количество строк не задано) переместит на 1 строку. |
Cursor Forward | *ESC*[ | Переместит курсор вперед на COUNT позиций; по умолчанию (если количество столбцов не задано) переместит на 1 позицию. |
Cursor Backward | *ESC*[ | Переместит курсор назад на COUNT позиций; по умолчанию (если количество столбцов не задано) переместит на 1 позицию. |
Force Cursor Position | *ESC*[ | Принудительная установка позиции курсора. Работает точно так же, как и команда Cursor Home. |
Save Cursor | *ESC*[s | Сохраняет текущую позицию курсора. |
Unsave Cursor | *ESC*[u | Восстанавливает позицию курсора, как она была сохранена командой Save Cursor. |
Save Cursor & Attrs | *ESC*7 | Сохраняет текущую позицию курсора вместе с атрибутами (цвет?). |
Restore Cursor & Attrs | *ESC*8 | Восстанавливает текущую позицию курсора вместе с атрибутами, как это было сохранено ранее. |
Примечание: коды сохранения и восстановления позиции курсора не обслуживаются многими эмуляторами терминала. Единственные, которые это делают, насколько мне известно, это xterm и nxterm, хотя большинство эмуляторов терминала базируются на коде xterm. В настоящий момент tell, rxvt, kvt, xiterm и Eterm не поддерживали функцию сохранения и восстановления позиции курсора.
Scrolling. Это команды, управляющие скроллингом (прокруткой) экрана терминала.
Функция | Коды | Описание |
Scroll Screen | *ESC*[r | Разрешает прокрутку всего экрана целиком. |
*ESC*[ | Разрешает прокрутку от начальной строки | |
Scroll Down | *ESC*D | Прокручивает экран на одну строку вниз. |
Scroll Up | *ESC*M | Прокручивает экран на одну строку вверх. |
Tab Control. Команды управления табуляцией.
Функция | Коды | Описание |
Set Tab | *ESC*H | Устанавливает табуляцию в текущей позиции. |
Clear Tab | *ESC*[g | Очищает табуляцию в текущей позиции. |
Clear All Tabs | *ESC*[3g | Очищает все установленные позиции табуляции. |
Примечание: позиции табуляции это определенные позиции в строке, куда курсор будет перемещаться при выводе символа табуляции \t. Если позиции табуляции очищены, то курсор будет перемещаться в позиции, кратные интервалу табуляции по умолчанию (обычно 4 столбца).
Erasing Text. Команды для стирания текста.
Функция | Коды | Описание |
Erase End of Line | *ESC*[K | Стирает текст от текущей позиции курсора до конца текущей строки. |
Erase Start of Line | *ESC*[1K | Стирает текст от текущей позиции курсора до начала текущей строки. |
Erase Line | *ESC*[2K | Стирает всю текущую строку. |
Erase Down | *ESC*[J | Очищает экран от текущей строки вниз до нижней границы экрана. |
Erase Up | *ESC*[1J | Очищает экран от текущей позиции вверх до верхней границы экрана. |
Erase Screen | *ESC*[2J | Стирание экрана, с заполнением его цветом фона. Курсор при этом перемещается "домой" (верхний левый угол экрана). |
Printing. Некоторые терминалы поддерживают локальный вывод на печать:
Функция | Коды | Описание |
Print Screen | *ESC*[i | Печать текущего экрана. |
Print Line | *ESC*[1i | Печать текущей строки. |
Stop Print Log | *ESC*[4i | Запрет печати лога. |
Start Print Log | *ESC*[5i | Начать печать в лог; весь принятый текст по мере поступления эхом вводится на принтер. |
Define Key.
Функция | Коды | Описание |
Set Key Definition | *ESC*[ | Связывает строку текста string с клавишей клавиатуры key. |
Set Display Attributes. Установка атрибутов дисплея.
Функция | Коды | Описание |
Set Attribute Mode | *ESC*[ | Устанавливает несколько настроек атрибутов. Ниже приведены списки некоторых стандартных атрибутов. |
0 Сбросить все атрибуты
1 Bright (повышенная яркость)
2 Dim (затемнение)
4 Underscore (нижнее подчеркивание)
5 Blink (мигание)
7 Reverse (инверсия)
8 Hidden (скрыть текст)
Foreground Colours (цвет пера, этим цветом выводится текст):
30 Black (черный)
31 Red (красный)
32 Green (зеленый)
33 Yellow (желтый)
34 Blue (синий)
35 Magenta (пурпурный)
36 Cyan (голубой)
37 White (белый)
Background Colours (цвет бумаги, или цвет фона):
40 Black (черный)
41 Red (красный)
42 Green (зеленый)
43 Yellow (желтый)
44 Blue (синий)
45 Magenta (пурпурный)
46 Cyan (голубой)
47 White (белый)
[Примеры использования]
Управляющие кодовые последовательности терминала ANSI (ANSI escape sequences, так называемые esc-коды, или esc-последовательности) позволят Вам перемещать позицию курсора (позицию вывода текста) в любое нужное знакоместо экрана. Это особенно полезно для полноэкранного интерфейса с пользователем, который генерируется скриптами shell, но также может использоваться в приглашениях ввода (prompts).
Для примера попробуйте вывести следующую строку кода в приглашении терминала (лучше всего результат работы этой команды будет виден, если вставить несколько пустых строк в окне терминала):
Эта команда должна переместить курсор на 7 строк вверх, напечатать " BASH ", и затем вернуться в начальную позицию, чтобы сделать нормальное приглашение терминала (prompt). Это не простое приглашение, а просто демонстрация перемещения курсора по экрану, с использованием цвета, чтобы обозначить результат работы команды. Обратите внимание, что ESC-код в командах представлен в восьмеричном формате (\033).
Еще один пример, сохраните этот текст в файле и назовите его "clock":
Промт, запущенный этим скриптом, выглядит как обычный, за исключением того, что в правом верхнем углу экрана будут выведено значение часов в 24-часовом формате. Этот скрипт не будет работать в терминалах, которые не поддерживают сохранение и восстановление позиции курсора терминала. При попытке выполнить этот скрипт в каком-либо из "неправильных" эмуляторов терминала (которые не поддерживают команду сохранения и восстановления позиции курсора), часы отобразятся правильно, но промт появится на второй строке терминала.
Источник