Стал все чаще и чаще в своей работе встречать разные *nix системы, по этому нужно как то облагородить наше рабочие пространство.
За строку приглашения отвечают такие переменные среды, как PS1, PS2, PS3, PS4 и PROMPT_COMMAND.
PS1 — переменная, которая задает вид строки приглашения командной строки, которое bash выводит, когда ожидает ввода очередной команды пользователем.
PS2 — переменная, отвечающая за вторичный тип приглашения ввода.
PS3 — третичное приглашение, выводится тогда, когда пользователь должен сделать выбор в операторе select.
PS4 — приглашение четвертого уровня, выводится при отладки сценариев (скриптов) в начале каждой строки перед командой перед исполняющейся командой.
PROMPT_COMMAND — содержимое этой переменной выполняется перед каждой строкой приглашения.
Значение каждой переменной можно узнать, введя в терминале:
1 |
$ echo $имя_переменной |
Изменить значение переменной можно двумя способами.
Способ первый — указать значение непосредственно в терминале с помощью команды export:
1 |
$ export имя_переменной='значение' |
Переменная PS1
К примеру, указать значение переменной PS1:
1 2 |
# export PS1='\[\e[1;32m\][\A][\h][\u][\w]\$\[\e[0m\] ' [11:02][host][user][/home/admin]# |
Способ второй — с помощью редактора дописать в .bashrc требуемые значения:
1 2 |
# nano ~/.bashrc PS1='\[\e[1;32m\][\A][\h][\u][\w]\$\[\e[0m\] ' |
Для указания значений этой переменной используется специальный формат из управляющих последовательностей и обычного текста. Специальные управляющие последовательности упрощают настройку внешнего вида приглашения командной строки.
К примеру, следующая последовательность \$ заставляет Bash отображать знак доллара ($), когда пользователь является обычным пользователем системы, но заменяет знак доллара решеткой (#), когда пользователь является суперпользователем (root).
Каждая специальная последовательность начинается с обратной косой черты (backslash) — «\».
К примеру, последовательность \u указывает, что надо отобразить имя пользователя, \h — имя хоста, \w — текущую папку.
Наиболее популярны следующие управляющие последовательности:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
******************* Печатные символы ********************************* \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) |
1 2 3 4 5 6 |
******************* Непечатные символы ******************************* \nnn Непечатный символ, имеющий восьмеричный код nnn (к примеру esc) \a Звуковой сигнал (ASCII-код 007) \e escape (ASCII-код 033) \[ Начало последовательности не печатаемых символов (этот символ может быть использован для того, чтобы включить в текст подсказки последовательность управляющих символов терминала) \] Конец последовательности не печатаемых символов |
С помощью специальных непечатаемых последовательностей можно изменить цвет приглашения командной строки, что выделит его из обычного текста. Чтобы показать, что вводится значение цвета, необходимо ввести управляющую ASCII-последовательность \e (или восьмеричный ASCII-кодом \033 ).
Одна из проблем, которая возникает при использовании не печатных последовательностей, заключается в том, что Bash вычисляет количество символов в приглашении командной строки и использует это число для размещения текста в терминальном окне. Так как коды цветов не выводятся на экран, то они мешают корректному подсчету. Чтобы предотвратить подсчет непечатаемых символов, управляющие последовательности необходимо заключать в управляющие скобки \[ и \].
Изменению в командной строке поддается не только текст, но и фон, поэтому формат цвета можно указать двумя способами — для фона и цвета текста или только для текста.
Формат последовательности для фона и цвета :
1 |
\[\е[X;YY;X;YYm\] |
Формат последовательности только для текста :
1 |
\[\е[X;YYm\] |
Где X — специальный номер свойства цвета, а YY — специальный номер цвета. Свойством цвета может быть, например, повышенная или пониженная яркость. В формате для фона и цвета в начале указывается фон, а после цвет самого текста.
Свойство Код
Значение по умолчанию 0
Повышенная яркость 1
Пониженная яркость 2
Подчеркнутый 4
Нормальная яркость 5
Инвертированный 7
Скрытый 8
Цвет Текст Фон
Черный 30 40
Красный 31 41
Зеленый 32 42
Желтый 33 43
Синий 34 44
Фиолетовый 35 45
Голубой 36 46
Белый 37 47
Переменная PS2
Вторичная строка приглашения появляется, к примеру, когда ввод команды в первичном приглашении переносится на следующую строку. Сообщить командному интерпретатору о том, что ввод продолжается в следующей строке, можно, введя обратную косую черту «\» в конце строки и введя Enter. По умолчанию отображается как «>». Формат этой переменной идентичен формату переменной PS1.
Переменная PS3
Этот вид приглашения используется в скриптах, когда нужно сделать выбор при использовании оператора select. Простой наглядный пример bash-скрипта и его вывод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash # Пример третичного приглашения # установим PS3 для выбора ответа в виде трёх знаков больше PS3=">>> " echo -e "\nВам больше 20 лет или меньше?" select answer in "Да" "Нет" do echo -e '\e[37;44m'"\e[1mВаш выбор - $answer.\e[0m" echo -e "Продолжение работы скрипта...\n" break done exit 0 |
Переменная PS4
Приглашение четвертого уровня PS4 так же используется в скриптах. К примеру ключ -v заставляет выводить на экран терминала каждую команду прежде, чем она будет исполнена. Ключом -x подобно ключу -v, но выполняет подстановку команд и перед каждой командой выведет четверичное приглашение.
PROMPT_COMMAND
С помощью этой переменной можно задать выполнение определённых команд перед каждым первичным приглашением. В основном, она используется, когда нужно расширить возможности первичного приглашения, вызывая какую-то дополнительную функцию или команду или даже целый скрипт. К примеру, я хочу, чтобы перед каждым первичным приглашением происходил вывод текущего каталога и календаря на месяц:
1 |
PROMPT_COMMAND='ls; cal' |
Мой .bashrc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# ~/.bashrc: executed by bash(1) for non-login shells. export PS1='\[\e[1;32m\][\A][\h][\u][\w]\$\[\e[0m\] ' export PS2='\[\e[1;35m\][\A] -->\[\e[0m\] ' umask 022 export LS_OPTIONS='--color=auto' eval "`dircolors`" alias ll='ls $LS_OPTIONS -l' alias iptbshow='iptables -n -L -v --line-numbers' shopt -s histappend PROMPT_COMMAND='history -a' shopt -s cdspell export HISTCONTROL="ignoredups" export HISTIGNORE="&:ls:[bf]g:exit" shopt -s cmdhist export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S ' export TIMEFORMAT=$'\nreal %3R\tuser %3U\tsys %3S\tpcpu %P\n' |
Источник: Строка приглашения в Bash
Обновленная заметка: https://nahoste.ru/linux/zametka-po-bashrc/
Свежие мысли