Как изменить приглашение bash

Простое описание по изменению приглашения в командной строке Linux.

Приглашение ко вводу команд в bash — это строка, которая отображается слева от каждой команды, которую вы вводите в терминале. Обычно приглашение имеет вид пользователь@hostname:директория$

Bash Promt PS1

Приглашение можно настраивать. Можно добавлять информацию или, например, изменить цвет приглашения.

В какой переменной задается приглашение

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

Например, переменная PS1 может иметь значение:

PS1="u@h:w$"

Или, например, командой echo $PS1 можно вывести текущее значение переменной PS1. У меня в Ubuntu оно выглядит так:

echo $PS1
[e]0;u@h: wa]${debian_chroot:+($debian_chroot)}[3[01;32m]u@h[3[00m]:[3[01;34m]w[3[00m]$

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

Как изменить приглашение (только для данной сессии)

Можно установить переменную PS1 только для текущей сессии в терминале. Это удобно, пока вы подбираете, как будет выглядеть строка приглашения. Чтобы это сделать нужно выполнить команду export для переменной PS1, например:

export PS1="u@w:"

После выполнения команды строка приглашения в терминале сразу изменится.

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

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

Специальные символы начинаются с символа косой черты «», за которой следует буква или символ. Ниже приведена таблица специальных символов.

Обозначение Описание
a ASCII-символ bell (07)
d Дата в формате «День недели Месяц Дата» (например, «Пн Ноя 26»)
D{format} Значение format передается функции strftime. В строку приглашения подставляется результат выполнения функции. Фигурные скобки обязательны.
e ASCII-символ escape (033)
h Hostname (имя хоста) до первого символа точка «.».
H Hostname (имя хоста, компьютера).
j Количество фоновых процессов, запущенных в данной оболочке
l Базовое название оболочки.
n Переход на новую строку.
r Переход к началу строки (возврат каретки).
s Имя оболочки (имя shell).
t Текущее время в 24-часовом формате (HH:MM:SS).
T Текущее время в 12-часовом формате (HH:MM:SS).
@ Текущее время в 12-часовом am/pm формате.
A Текущее время в 24-часовом формате (HH:MM).
u Имя пользователя.
v Версия bash (например, 4.4).
V Версия bash с версией релиза (например, 4.4.19).
w Текущий абсолютный путь (полный путь). Домашняя директория сокращается до значка тильды «~».
W Текущий относительный путь. Домашняя директория сокращается до значка тильды «~».
! Номер команды в истории команд (history).
# Номер команды в текущей сессии терминала.
$ Символ приглашения (# для root, $ для обычных пользователей).
nnn Символ, соответствующий восьмеричному значению nnn.
\ Символ обратной косой черты «».
[ Начало последовательности непечатаемых символов.
] Конец последовательности.

Примеры

Пример 1

Приглашение, состоящее из одного символа «>»:

PS1=">"

Пример 2

Текущее время, пользователь, текущая директория:

PS1="A u@w$"

Пример 3

Дата, пользователь, текущая директория, номер команды:

PS1="d:u:w!>"

Как изменить цвета в строке приглашения

Элементы строки приглашения можно раскрашивать в разные цвета.

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

Используется следующий синтаксис:
e[X;YmРАСКРАШИВАЕМАЯ_СТРОКАe[m

e[ — начало цветовой схемы.
X;Ym — цветовая пара (X;Y). Именно значения X и Y определяют цвет.
e[m — окончание цветовой схемы.

Небольшой пример, чтобы вы понимали о чем идет речь. Раскрасим всю строку целиком цветом с обозначением 0;36.

export PS1="e[0;36mu@h W$ e[m"

Цвета задаются числами. Можно задавать парой X;Y или просто Y. Например, красный это — 0;31 или просто 31. Есть и другие способы задания цветов, но в данной статье мы их не рассматриваем.

Список цифровых обозначений для цветов (Y):

Цвет Числовое
обозначение
Black 30
Red 31
Green 32
Brown 33
Blue 34
Purple 35
Cyan 36
Light gray 37
Dark gray 90
Light red 91
Light green 92
Light yellow 93
Light blue 94
Light magenta 95
Light cyan 96
White 97

При задании цвета двумя числами X;Y, первое число X принимает следующие значения:
0 — обычный цвет;
1 — будет использоваться более яркий цвет;
2 — более темный цвет;
3 — курсив;
4 — подчеркивание;
5 — моргание.

Примеры

Пример 1

Например, установим имя пользователя желтым цветом, а остальной текст оставим стандартным цветом (в моем случае это белый). Для указания желтого цвета используем обозначение 1;33 (как светло-коричневый).

export PS1="e[1:33mue[m@h W$ "

Пример 2

Раскрасим остальные элементы строки приглашения:

export PS1="e[1;33mue[m@e[0;96mhe[m e[0;92mWe[m$ "

Как изменить приглашение на постоянной основе

Новое значение переменной PS1 прописывается в файле .bashrc, который расположен в вашей домашней директории (файл может отсутствовать).

Откроем файл .bashrc в редакторе nano для редактирования. Для этого в терминале выполним команду:

nano ~/.bashrc

Перейдем в конец файла и добавим новую строку, в которой пропишем значение переменной PS1. Например:

PS1="u@w$"

Сохраним изменения и закроем файл. Для этого нажмите Ctrl+X, затем Y и Enter, чтобы сохранить изменения.

Теперь выполним команду source, чтобы наши изменения вступили в силу:

source ~/.bashrc

Перезапустите терминал. Приглашение для ввода команд будет обновлено.

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

Приглашение ко вводу команд в bash — это строка, которая отображается слева от каждой команды, которую вы вводите в терминале. Обычно приглашение имеет вид пользователь@hostname:директория$

Вид приглашения командной строки Bash определяется переменной PS1. Его можно просмотреть как любую другую переменную окружения:

Как изменить приглашение (только для данной сессии)

Можно установить переменную PS1 только для текущей сессии в терминале. Это удобно, пока вы подбираете, как будет выглядеть строка приглашения. Чтобы это сделать нужно выполнить команду export для переменной PS1, например:

После выполнения команды строка приглашения в терминале сразу изменится.

Как изменить приглашение на постоянной основе

Новое значение переменной PS1 прописывается в файле .bashrc, который расположен в вашей домашней директории (файл может отсутствовать).

Откроем файл .bashrc в редакторе nano для редактирования. Для этого в терминале выполним команду:

Перейдем в конец файла и добавим новую строку, в которой пропишем значение переменной PS1. Например:

Сохраним изменения и закроем файл. Для этого нажмите Ctrl+X, затем Y и Enter, чтобы сохранить изменения.

Теперь выполним команду source, чтобы наши изменения вступили в силу:

Перезапустите терминал. Приглашение для ввода команд будет обновлено.

Как изменить цвета в строке приглашения

Элементы строки приглашения можно раскрашивать в разные цвета.

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

Используется следующий синтаксис:

e[X;YmРАСКРАШИВАЕМАЯ_СТРОКАe[m

e[ — начало цветовой схемы.
X;Ym — цветовая пара (X;Y). Именно значения X и Y определяют цвет.
e[m — окончание цветовой схемы.

Небольшой пример, чтобы вы понимали о чем идет речь. Раскрасим всю строку целиком цветом с обозначением 0;36.

export PS1="e[0;36mu@h W$ e[m"

Цвета задаются числами. Можно задавать парой X;Y или просто Y. Например, красный это — 0;31 или просто 31. Есть и другие способы задания цветов, но в данной статье мы их не рассматриваем.

Список цифровых обозначений для цветов (Y):

Цвет Числовое обозначение
Black 30
Red 31
Green 32
Brown 33
Blue 34
Purple 35
Cyan 36
Light gray 37
Dark gray 90
Light red 91
Light green 92
Light yellow 93
Light blue 94
Light magenta 95
Light cyan 96
White 97

При задании цвета двумя числами X;Y, первое число X принимает следующие значения:

0 — обычный цвет;
1 — будет использоваться более яркий цвет;
2 — более темный цвет;
3 — курсив;
4 — подчеркивание;
5 — моргание.

Примеры

Простой вывод текущего пользователя и полного пути:

Такойже вывод, но с подстветкой:

PS1="[e]0;u@h: wa]${debian_chroot:+($debian_chroot)}[33[01;32m]u@h[33[00m]:[33[01;34m]w[33[00m]$ "

Список возможных настроек приглашения

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

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

Обозначение Описание
a ASCII-символ bell (07)
d Дата в формате «День недели Месяц Дата» (например, «Пн Ноя 26»)
D{format} Значение format передается функции strftime.
В строку приглашения подставляется результат выполнения функции. Фигурные скобки обязательны.
e ASCII-символ escape (033)
h Hostname (имя хоста) до первого символа точка ..
H Hostname (имя хоста, компьютера).
j Количество фоновых процессов, запущенных в данной оболочке
l Базовое название оболочки.
n Переход на новую строку.
r Переход к началу строки (возврат каретки).
s Имя оболочки (имя shell).
t Текущее время в 24-часовом формате (HH:MM:SS).
T Текущее время в 12-часовом формате (HH:MM:SS).
@ Текущее время в 12-часовом am/pm формате.
A Текущее время в 24-часовом формате (HH:MM).
u Имя пользователя.
v Версия bash (например, 4.4).
V Версия bash с версией релиза (например, 4.4.19).
w Текущий абсолютный путь (полный путь). Домашняя директория сокращается до значка тильды ~.
W Текущий относительный путь. Домашняя директория сокращается до значка тильды ~.
! Номер команды в истории команд (history).
# Номер команды в текущей сессии терминала.
$ Символ приглашения (# для root, $ для обычных пользователей).
nnn Символ, соответствующий восьмеричному значению nnn.
\ Символ обратной косой черты .
[ Начало последовательности непечатаемых символов.
] Конец последовательности.

If you are using the Linux operating system, that means you use the CLI most of the time. And do more work on the terminal. By default, most Linux Operating systems provide you the bash shell. Shell provides the interface between the user and kernel and executes commands. In this article, we are going to see how to customize the bash shell prompt

Understanding Default BASH prompt

Before customizing the bash shell prompt first understand the default bash prompt. This default prompt looks like follows:

username@hostname:~$

or 

[username@hostaname ~]$

The first part i.e string before @ character of bash prompt indicates the username of the current user. The last part of the bash prompt indicates the hostname of the system. Then the ~ sign indicates the current path of the prompt. If the sign after the : or ] character is $ that means the account is standard or if this character is # then the account is the root

Understanding Different Parts of BASH Prompt

To customize the bash prompt, first, we should understand how the bash prompt works. Bash provides the Prompt Statement. There are four bash prompt statement

  • PS1 – This is the primary prompt statement. We will customize this prompt.
  • PS2 – This is the secondary prompt statement. Basically, it is used when the user provides the long command separated by characters.
  • PS3 – This prompt is used to select the command.
  • PS4 – This prompt is used for running a shell script in debug mode.

To see the value of your current PS1 prompt statement, you can use the following command:

echo $PS1

The ps1 has contained the backslash and other alphabetic characters which has a special meaning which is listed in the PROMPTING section of the man page. In the above output, we can see that u h and W are the prompting characters and @ and # are special characters.

To customize the bash prompt, we are going to work on the PS1 prompt and PS2 prompt. Generally, the PS2 prompt contains only one character >.  To view the content of the PS2 prompt use the echo command:

echo $PS2

And the $PS3 will be blank and PS4 will contain the + character

Customize Bash Prompt In Linux

The bash prompt can be customized from the ~/.bashrc file. This file contains the prompt Statement. This file is present in the home directory of the user.

~/.bashrc

Before editing this file, make the backup of the ~/.bashrc file. Use the following command to make a backup of the ~/.bashrc file

cp ~/.bashrc  ~/.bashrc.bak

Change Bash Prompt in Linux Permanently

To change the bash prompt permanently, we can edit the file ~/.bashrc and change the values of the PS1. To edit this file you can use any editor, but in this tutorial, we are going with nano editor, because it is easy to use. Now to open the ~/.bashrc file, use the following command:

nano ~/.bashrc

Then you will see there is a PS1 variable.

You can edit the value of this variable to change your prompt. For now, let’s change the value of this prompt to bashprompt>. Then save the file using the ctrl+s and then close the file using ctrl+x. Then use the following command to see changes in prompt

source ~/.bashrc

Now we have changes our bash prompt permanently.

Create a Temporary Change to the BASH Prompt

We can change our bash prompt temporarily using the export command, this prompt will work for the current session. To change the temporary bash shell prompt, use the following command:

export PS1="bashprompt>"

Or you can just run to enter the PS1 variable with value  as a command:

 Modify “username@hostname” part in the Bash prompt

Most of the Linux distributions contain the username@hostname as a bash prompt. We can change it to anything we want. We have to just modify the value of the PS1 variable. In the above two sections, we have seen how to modify the value of the PS1 characters permanently and temporarily. Change the value of PS1 according to your need. So now  to change the username@hostname to “myprompt@linux> ” we can set the value of PS1 to 

export PS1="myprompt@linux> "

Now let’s see how to add emojis in the bash prompt. To add the emojis to the prompt, first, make sure that you have installed any emoji font on the system. To use the emoji in the prompt, just put the emoji in the PS1 variable. Here is one example:

 PS1="???? ~ "

To show the version of bash shell in the prompt, put the v prompting character in the PS1 variable:

PS1="Bash v>"

And to show the current bash version with the patch level, use the V prompting character:

 PS1="Bash V>"

Customizing the PS1 Format

To customize the PS1 prompt, we need to edit the content of the PS1 prompt. The PS1 contains some characters followed by the backslash characters. Following are the same characters that are written in the PS1 prompt:

  • u: This character indicates the username of the current user.
  • h: This character indicates the hostname till the first ‘ . ‘ Character in the Fully-Qualified Domain Name
  • W: This character shows the base path of the current working directory. For the home directory, the value will be tilde (~) character.
  • $: This character is used to separate the command and prompt. If the account is standard then this field contains $ character, or if the account is root then this field contains the # character.

Now let’s add some other options in PS1 and check how our prompt looks like the ! Character shows the number of the current commands and H character shows the Full  Fully-Qualified Domain hostname instead of showing till ‘ . ‘ Character. Here is the prompt now:

PS1="[u@H W !]$"

In the next sections, we are going to explore more prompting options or characters.

Popular Custom Options for BASH Prompts

Now let’s see how can we customize the bash prompt using the options provided by the bash shell for the prompt. Before adding any option to the prompt, use the character before the options.

Display Username and Domain Name

Bash prompt provides two options, by using these we can show hostname and username in prompt. 

  • To show username in prompt, use u character followed by character.
  • To show hostname in prompt, use h character in PS1.

Here is one example:

export PS1="u h >"

Add Special Characters

We can add the special character in the bash prompt. Just arrange them in order how you want to customize the prompt. Here is one example:

export PS1="u@h> "

You should always use the special character at the end of the prompt, which will be useful to separate the command and prompt.

Add Date and Time to The BASH Prompt

Now let’s see how we can add the time to the bash prompt. Following are the options which will be used to display date and time in prompt

  • d – This option will show the date in “Weekday Month Date”  format

  • t – This option will show the current time in 24-hour HH:MM:SS format

  • T – This option will show the current time in 12-hour HH:MM:SS format

  • A  –  This option will show   the current time in 24-hour HH:MM format

Hide All Information in the BASH Prompt

To prevent the showing username and hostname into prompt just don’t use the h and u characters in the PS1 variable. Just use the W character to display the path of the current directory.

Differentiate Root User From Normal User

The bash prompt is differentiated using the $ and # characters at the end of the prompt. The $ character is used for the standard user and the # character is used for the root user.

export PS1="u@H W:$ "

To know all color options, you read the PROMPTING section of the man page of bash. Using the man command.

tput command

tput is a command that provides the terminal dependent information to the shell .tput command queries the term info database for the information. Now let’s see how we can use the tput command to change the prompt color. Now let’s see how to change the color of the background and foreground of the prompt.

export PS1=”[$(tput setaf 1)][$(tput setab 7)]u@h:w $ [$(tput sgr0)]”

Following are the options that can be used with the tput command:

  • tput bold –To apply the bold effect
  • tput rev – To display inverse color
  • tput sgr0 – To reset everything
  • tput setaf {code}– To set the foreground color. See the table below to know the value of {code}
  • tput setab {code}– To set background color, See the table below to know value of {code}

Color codes that are used with tput command:

Color {code} Color
0 Black
1 Red
2 Green
3 Yellow
4 Blue
5 Magenta
6 Cyan
7 White

How to Change BASH Prompt Color

We can change the color of the bash prompt. Here is one example:

export PS1="e[0;32m[u@h W]$ e[0m"

Now let’s see how we can change the color of the bash prompt:

  • e[  – This string tells bash prompt to apply color from next character.
  • 0;32m  – This string represents the colors. The number before the; represent typeface. And the number after the ; represent color code.
  • e[0m – This string will tell the bash prompt to apply the color to the previous character.

Following are the values for the typeface:

  • 0 – Normal
  • 1 – Bold
  • 2 – Dim
  • 4 – Underlined

Following are the values for the color codes:

  • 30 – Black
  • 31 – Red
  • 32 – Green
  • 33 – Brown
  • 34 – Blue
  • 35 – Purple
  • 36 – Cyan
  • 37 – Light gray

You can create the themes using different combinations of the above colors.

How to Reset BASH Changes to Default Settings

If you want the shell back as it is, then we can do that. At the start of this article, we have created the backup file the ~/.bashrc file. Now to get back our original bash prompt, we can use that file. Use the following command:

cat ~/.bashrc.bak > ~/.bashrc

To know more about the bash prompt, read the man page of the bash.

man bash

If you are using the Linux operating system, that means you use the CLI most of the time. And do more work on the terminal. By default, most Linux Operating systems provide you the bash shell. Shell provides the interface between the user and kernel and executes commands. In this article, we are going to see how to customize the bash shell prompt

Understanding Default BASH prompt

Before customizing the bash shell prompt first understand the default bash prompt. This default prompt looks like follows:

username@hostname:~$

or 

[username@hostaname ~]$

The first part i.e string before @ character of bash prompt indicates the username of the current user. The last part of the bash prompt indicates the hostname of the system. Then the ~ sign indicates the current path of the prompt. If the sign after the : or ] character is $ that means the account is standard or if this character is # then the account is the root

Understanding Different Parts of BASH Prompt

To customize the bash prompt, first, we should understand how the bash prompt works. Bash provides the Prompt Statement. There are four bash prompt statement

  • PS1 – This is the primary prompt statement. We will customize this prompt.
  • PS2 – This is the secondary prompt statement. Basically, it is used when the user provides the long command separated by characters.
  • PS3 – This prompt is used to select the command.
  • PS4 – This prompt is used for running a shell script in debug mode.

To see the value of your current PS1 prompt statement, you can use the following command:

echo $PS1

The ps1 has contained the backslash and other alphabetic characters which has a special meaning which is listed in the PROMPTING section of the man page. In the above output, we can see that u h and W are the prompting characters and @ and # are special characters.

To customize the bash prompt, we are going to work on the PS1 prompt and PS2 prompt. Generally, the PS2 prompt contains only one character >.  To view the content of the PS2 prompt use the echo command:

echo $PS2

And the $PS3 will be blank and PS4 will contain the + character

Customize Bash Prompt In Linux

The bash prompt can be customized from the ~/.bashrc file. This file contains the prompt Statement. This file is present in the home directory of the user.

~/.bashrc

Before editing this file, make the backup of the ~/.bashrc file. Use the following command to make a backup of the ~/.bashrc file

cp ~/.bashrc  ~/.bashrc.bak

Change Bash Prompt in Linux Permanently

To change the bash prompt permanently, we can edit the file ~/.bashrc and change the values of the PS1. To edit this file you can use any editor, but in this tutorial, we are going with nano editor, because it is easy to use. Now to open the ~/.bashrc file, use the following command:

nano ~/.bashrc

Then you will see there is a PS1 variable.

You can edit the value of this variable to change your prompt. For now, let’s change the value of this prompt to bashprompt>. Then save the file using the ctrl+s and then close the file using ctrl+x. Then use the following command to see changes in prompt

source ~/.bashrc

Now we have changes our bash prompt permanently.

Create a Temporary Change to the BASH Prompt

We can change our bash prompt temporarily using the export command, this prompt will work for the current session. To change the temporary bash shell prompt, use the following command:

export PS1="bashprompt>"

Or you can just run to enter the PS1 variable with value  as a command:

 Modify “username@hostname” part in the Bash prompt

Most of the Linux distributions contain the username@hostname as a bash prompt. We can change it to anything we want. We have to just modify the value of the PS1 variable. In the above two sections, we have seen how to modify the value of the PS1 characters permanently and temporarily. Change the value of PS1 according to your need. So now  to change the username@hostname to “myprompt@linux> ” we can set the value of PS1 to 

export PS1="myprompt@linux> "

Now let’s see how to add emojis in the bash prompt. To add the emojis to the prompt, first, make sure that you have installed any emoji font on the system. To use the emoji in the prompt, just put the emoji in the PS1 variable. Here is one example:

 PS1="???? ~ "

To show the version of bash shell in the prompt, put the v prompting character in the PS1 variable:

PS1="Bash v>"

And to show the current bash version with the patch level, use the V prompting character:

 PS1="Bash V>"

Customizing the PS1 Format

To customize the PS1 prompt, we need to edit the content of the PS1 prompt. The PS1 contains some characters followed by the backslash characters. Following are the same characters that are written in the PS1 prompt:

  • u: This character indicates the username of the current user.
  • h: This character indicates the hostname till the first ‘ . ‘ Character in the Fully-Qualified Domain Name
  • W: This character shows the base path of the current working directory. For the home directory, the value will be tilde (~) character.
  • $: This character is used to separate the command and prompt. If the account is standard then this field contains $ character, or if the account is root then this field contains the # character.

Now let’s add some other options in PS1 and check how our prompt looks like the ! Character shows the number of the current commands and H character shows the Full  Fully-Qualified Domain hostname instead of showing till ‘ . ‘ Character. Here is the prompt now:

PS1="[u@H W !]$"

In the next sections, we are going to explore more prompting options or characters.

Popular Custom Options for BASH Prompts

Now let’s see how can we customize the bash prompt using the options provided by the bash shell for the prompt. Before adding any option to the prompt, use the character before the options.

Display Username and Domain Name

Bash prompt provides two options, by using these we can show hostname and username in prompt. 

  • To show username in prompt, use u character followed by character.
  • To show hostname in prompt, use h character in PS1.

Here is one example:

export PS1="u h >"

Add Special Characters

We can add the special character in the bash prompt. Just arrange them in order how you want to customize the prompt. Here is one example:

export PS1="u@h> "

You should always use the special character at the end of the prompt, which will be useful to separate the command and prompt.

Add Date and Time to The BASH Prompt

Now let’s see how we can add the time to the bash prompt. Following are the options which will be used to display date and time in prompt

  • d – This option will show the date in “Weekday Month Date”  format

  • t – This option will show the current time in 24-hour HH:MM:SS format

  • T – This option will show the current time in 12-hour HH:MM:SS format

  • A  –  This option will show   the current time in 24-hour HH:MM format

Hide All Information in the BASH Prompt

To prevent the showing username and hostname into prompt just don’t use the h and u characters in the PS1 variable. Just use the W character to display the path of the current directory.

Differentiate Root User From Normal User

The bash prompt is differentiated using the $ and # characters at the end of the prompt. The $ character is used for the standard user and the # character is used for the root user.

export PS1="u@H W:$ "

To know all color options, you read the PROMPTING section of the man page of bash. Using the man command.

tput command

tput is a command that provides the terminal dependent information to the shell .tput command queries the term info database for the information. Now let’s see how we can use the tput command to change the prompt color. Now let’s see how to change the color of the background and foreground of the prompt.

export PS1=”[$(tput setaf 1)][$(tput setab 7)]u@h:w $ [$(tput sgr0)]”

Following are the options that can be used with the tput command:

  • tput bold –To apply the bold effect
  • tput rev – To display inverse color
  • tput sgr0 – To reset everything
  • tput setaf {code}– To set the foreground color. See the table below to know the value of {code}
  • tput setab {code}– To set background color, See the table below to know value of {code}

Color codes that are used with tput command:

Color {code} Color
0 Black
1 Red
2 Green
3 Yellow
4 Blue
5 Magenta
6 Cyan
7 White

How to Change BASH Prompt Color

We can change the color of the bash prompt. Here is one example:

export PS1="e[0;32m[u@h W]$ e[0m"

Now let’s see how we can change the color of the bash prompt:

  • e[  – This string tells bash prompt to apply color from next character.
  • 0;32m  – This string represents the colors. The number before the; represent typeface. And the number after the ; represent color code.
  • e[0m – This string will tell the bash prompt to apply the color to the previous character.

Following are the values for the typeface:

  • 0 – Normal
  • 1 – Bold
  • 2 – Dim
  • 4 – Underlined

Following are the values for the color codes:

  • 30 – Black
  • 31 – Red
  • 32 – Green
  • 33 – Brown
  • 34 – Blue
  • 35 – Purple
  • 36 – Cyan
  • 37 – Light gray

You can create the themes using different combinations of the above colors.

How to Reset BASH Changes to Default Settings

If you want the shell back as it is, then we can do that. At the start of this article, we have created the backup file the ~/.bashrc file. Now to get back our original bash prompt, we can use that file. Use the following command:

cat ~/.bashrc.bak > ~/.bashrc

To know more about the bash prompt, read the man page of the bash.

man bash

Состояние перевода: На этой странице представлен перевод статьи Bash/Prompt customization. Дата последней синхронизации: 10 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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

Приглашения

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

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

Настройка конкретного приглашения подразумевает присваивание (обычно в файле ~/.bashrc) необходимой строки в переменную, например:

PS2='> '

Техники

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

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

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

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

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

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

$ infocmp

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

$ tput setaf 2

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

Примечание: Если команда tput не работает, убедитесь, что значение TERM имеет верное значение для вашего терминала. Например, если установлено значение xterm вместо xterm-256color, то tput setaf будет работать только с номерами цветов 0-7.

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

GREEN="[$(tput setaf 2)]"
RESET="[$(tput sgr0)]"

PS1="${GREEN}my prompt${RESET}> "

my prompt>

Примечание: Руководство Bash рекомендует «обернуть» вывод tput в [ ]. Это поможет Bash правильно учитывать непечатаемые символы при вычислении длины приглашения. При подстановке команд это не работает, поэтому используйте значения 1 2.

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:

ESC=$(printf "e")
PEACH="$ESC[48;5;209m"

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

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

PS1="$(awk '/MemFree/{print $2}' /proc/meminfo) prompt > "
53718 prompt >
53718 prompt >
53718 prompt >

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

PS1="$(awk '/MemFree/{print $2}' /proc/meminfo) prompt > "
# или
PS1='$(awk "/MemFree/{print $2}" /proc/meminfo) prompt > '

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

free_mem()
{
    awk '/MemFree/{print $2}' /proc/meminfo
}

PS1='$(free_mem) prompt > '

Примечание: В подстановочных функциях можно использовать escape-последовательности terminfo/ANSI, но не последовательности Bash. В частности, [ ] не будет работать при обрамлении ими строки с непечатаемыми символами. Вместо этого используйте восьмеричные экранированные последовательности 01 и 02 (например, в командах printf или echo -e).

PROMPT_COMMAND

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

Важно: PROMPT_COMMAND не должна использоваться для вывода символов непосредственно в приглашение. Символы, напечатанные вне PS1, не учитываются Bash, что может привести к неправильному позиционированию курсора и обычных символов. Либо используйте PROMPT_COMMAND для задания PS1, либо изучите рекомендации в разделе #Встроенные команды.

Совет: Если PROMPT_COMMAND стала слишком сложной, bash-preexec (реализация хук-функций preexec и precmd Zsh для Bash) может упростить работу с ней.

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

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

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

$ trap 'tput sgr0' DEBUG

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

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

Примеры

Цвета

Совет: Вывод infocmp содержит доступное для tput количество цветов, например — colors#8.

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

for C in {0..255}; do
    tput setab $C
    echo -n "$C "
done
tput sgr0
echo

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

# стандартные цвета
for C in {40..47}; do
    echo -en "e[${C}m$C "
done
# цвета высокой интенсивности
for C in {100..107}; do
    echo -en "e[${C}m$C "
done
# 256 цветов
for C in {16..255}; do
    echo -en "e[48;5;${C}m$C "
done
echo -e "e(Be[m"

Аналогичные значения для текста (не фона): стандартные — 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(BE[m отключить все атрибуты текста
Перемещение курсора
sc E7 сохранить позицию курсора
rc E8 вернуть курсор в сохранённую позицию
clear E[HE[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="$? > "
# или
PS1='$? > '

0 > true
0 > false
1 >

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

exitstatus()
{
    if [[ $? == 0 ]]; then
        echo ':)'
    else
        echo 'D:'
    fi
}
PS1='$(exitstatus) > '

:) > true
:) > false
D: >

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

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

PS1="[$(tput sc; перемещение курсора) работа с курсором $(tput rc)] работа с курсором после возврата"

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

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

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

rightprompt()
{
    printf "%*s" $COLUMNS "right prompt"
}

PS1='[$(tput sc; rightprompt; tput rc)]left prompt > '

left prompt > right prompt

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

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

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

$ tput cup $((LINES - 11)) $((COLUMNS - 6))

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

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

PS1='[e]2;новое названиеa]prompt > '

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

Смотрите также

  • Примеры и скриншоты на теме форума: What’s your PS1? (доступно только после входа)
  • Файл /etc/bash/bashrc для Gentoo; см. также gentoo-bashrcAUR
  • tput(1)
    • Справка по tput на сайте bash-hackers.org
    • Цвета и перемещение курсора с tput
  • Приглашение Bash HOWTO
  • Коллекция примеров приглашений от Giles Orr
  • Советы Bash: цвета и форматирование
  • Liquid Prompt — полезное адаптивное приглашение для Bash & zsh
  • Bash POWER PROMPT
  • Wikipedia:ru:Управляющие последовательности ANSI
  • Руководство GNU Bash: управление приглашением

Ссылки по теме

  • Bash (Русский)
  • Переменные окружения

Состояние перевода: На этой странице представлен перевод статьи Color Bash Prompt. Дата последней синхронизации: 2015-07-21. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Существуют различные возможности настройки строки приглашения Bash’а (PS1), которые могут сделать работу в командной строке комфортней и продуктивней. Например, можно добавить дополнительную информацию или цвет, чтобы приглашение ввода можно было легко обнаружить среди остального текста.

В этой статье рассказывается как настроить персональное приглашение для обычного пользователя.

Contents

  • 1 Применение настроек
  • 2 Базовые приглашения
    • 2.1 Обычный пользователь
    • 2.2 Root
  • 3 Профессиональные приглашения
    • 3.1 Обычный пользователь
    • 3.2 Root
  • 4 Максимальные приглашения
    • 4.1 Статус нагрузки/памяти для 256colors
    • 4.2 Список цветов для приглашений и Bash
    • 4.3 Прерывания приглашения
    • 4.4 Позиционирование курсора
    • 4.5 Отображение кода возврата
  • 5 Советы и подсказки
    • 5.1 Разные цвета при вводе текста и при выводе
    • 5.2 Случайные цитаты при входе
    • 5.3 Раскрашенные последние новости Arch при входе
    • 5.4 Просмотр цветов
    • 5.5 Раскрашенное git приглашение
    • 5.6 Раскрашенные существующие бесцветные приглашения
  • 6 Смотрите также

Применение настроек

Чтобы применить изменения, сделанные в файле .bashrc, без перезапуска shell, запустите команду:

Базовые приглашения

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

Обычный пользователь

Зелёное приглашение для обычных пользователей:

[chiri@zetsubou ~]$ _
~/.bashrc

#PS1='[u@h W]$ '  # Default
PS1='[e[1;32m][u@h W]$[e[0m] '

Root

Красное приглашение для root (скопируйте из /etc/skel/, если ещё не сделали этого):

[root@zetsubou ~]# _
/root/.bashrc

#PS1='[u@h W]$ '  # Default
PS1='[e[1;31m][u@h W]$[e[0m] '

Профессиональные приглашения

Обычный пользователь

Зелёное с синим приглашение для обычных пользователей:

chiri ~/docs $ echo «sample output text»
sample output text
chiri ~/docs $ _
PS1='[e[0;32m]u[e[m] [e[1;34m]w[e[m] [e[1;32m]$[e[m] [e[1;37m]'

Этот пример предоставляет очень приятное цветное приглашение и тему консоли с ярко-белым цветом текста.

Вышеописанная строка содержит управляющие последовательности для цветового набора (начало окраски: [e[*color*], конец окраски: [e[m]) и информационные заполнители:

  • u — Имя пользователя. Исходное приглашение также содержит h, который печатает имя хоста.
  • w — Текущий абсолютный путь. Используйте W для текущего относительного пути.
  • $ — Символ приглашения (например, # для root, $ для обычных пользователей).
  • [ и ] — Эти теги должны обрамлять цветовые коды, чтобы bash понимал как правильно позиционировать курсор.

Последняя цветовая управляющая последовательность [e[1;37m] не закрыта, поэтому весь оставшийся текст (всё что вы набираете в терминале, вывод программ и т.д.) будет окрашено в этот (ярко белый) цвет. Вы можете захотеть изменить этот цвет или удалить последнюю управляющую последовательность для того, чтобы оставить последующий вывод в неизменном цвете.

PS1="[e[7;92m]u[e[7;93m]W][e[7;95m]$[e[0m] "

Этот пример отобразит строку приглашения с задним фоном. Строка очень хорошо отделяется посреди остального текста.

Root

Красное с синим приглашение для root:

root ~/docs # echo «sample output text»
sample output text
root ~/docs # _
PS1='[e[0;31m]u[e[m] [e[1;34m]w[e[m] [e[0;31m]$ [e[m][e[0;32m]'

Этот пример предоставляет красное выделение и зелёный цвет текста в консоли.

PS1="[e[7;92m]u[e[7;93m]W][e[7;91m]#[e[0m] "

В этом примере строка приглашения приобретает задний фон и очень хорошо выделяется среди остального текста, решётка с красным задним фоном.

Максимальные приглашения

Статус нагрузки/памяти для 256colors

Это даже не предел. Вместо использования sed для парсинга загрузки памяти и нагрузки (используя опцию -u для non-buffering) и встроенной команды history для сохранения вашей истории в HISTFILE после каждой команды, что может быть очень полезно, если у вас проблемы с вылетами оболочек или дочерних оболочек, этот пример по сути заставляет BASH печатать переменные, которые ему уже известны, таким обоазом делая его экстремально быстрым по сравнению с приглашениями, использующими не-встроенные команды.

Это приглашение из статьи BASH Power Prompt с AskApache.com, в которой разбираются подробности. Это особенно полезно для тех, кто хочет понять 256 цветные терминалы, ncurses, termcap и terminfo.

Этот пример для 256 цветных терминалов, из которых произошли 33[38;5;22m управляющие последовательности.

802/1024MB      1.28 1.20 1.13 3/94 18563
[5416:17880 0:70] 05:35:50 Wed Apr 21 [srot@host.sqpt.net:/dev/pts/0 +1] ~

(1:70)$ _
PROMPT_COMMAND='history -a;echo -en "33[m33[38;5;2m"$(( $(sed -nu "s/MemFree:[t ]+([0-9]+) kB/1/p" /proc/meminfo)/1024))"33[38;5;22m/"$(($(sed -nu "s/MemTotal:[t ]+([0-9]+) kB/1/Ip" /proc/meminfo)/1024 ))MB"t33[m33[38;5;55m$(< /proc/loadavg)33[m"'
PS1='[e[m
e[1;30m][$$:$PPID j:![e[1;30m]][e[0;36m] T d [e[1;30m][[e[1;34m]u@H[e[1;30m]:[e[0;37m]${SSH_TTY} [e[0;32m]+${SHLVL}[e[1;30m]] [e[1;37m]w[e[0;37m] 
($SHLVL:!)$ '

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

Добавьте это в ваш(и) Bash файл(ы), чтобы задать цвета для приглашений и команд:

txtblk='e[0;30m' # Black - Обычный
txtred='e[0;31m' # Red
txtgrn='e[0;32m' # Green
txtylw='e[0;33m' # Yellow
txtblu='e[0;34m' # Blue
txtpur='e[0;35m' # Purple
txtcyn='e[0;36m' # Cyan
txtwht='e[0;37m' # White
bldblk='e[1;30m' # Black - Жирный
bldred='e[1;31m' # Red
bldgrn='e[1;32m' # Green
bldylw='e[1;33m' # Yellow
bldblu='e[1;34m' # Blue
bldpur='e[1;35m' # Purple
bldcyn='e[1;36m' # Cyan
bldwht='e[1;37m' # White
unkblk='e[4;30m' # Black - Подчёркнутый
undred='e[4;31m' # Red
undgrn='e[4;32m' # Green
undylw='e[4;33m' # Yellow
undblu='e[4;34m' # Blue
undpur='e[4;35m' # Purple
undcyn='e[4;36m' # Cyan
undwht='e[4;37m' # White
bakblk='e[40m'   # Black - Фоновый
bakred='e[41m'   # Red
bakgrn='e[42m'   # Green
bakylw='e[43m'   # Yellow
bakblu='e[44m'   # Blue
bakpur='e[45m'   # Purple
bakcyn='e[46m'   # Cyan
bakwht='e[47m'   # White
txtrst='e[0m'    # Text Reset

Или если вы предпочитаете названия цветов, вы сможете писать их без необходимости их вычисления и желания высоко интенсивных цветов:

# Сброс
Color_Off='e[0m'       # Text Reset

# Обычные цвета
Black='e[0;30m'        # Black
Red='e[0;31m'          # Red
Green='e[0;32m'        # Green
Yellow='e[0;33m'       # Yellow
Blue='e[0;34m'         # Blue
Purple='e[0;35m'       # Purple
Cyan='e[0;36m'         # Cyan
White='e[0;37m'        # White

# Жирные
BBlack='e[1;30m'       # Black
BRed='e[1;31m'         # Red
BGreen='e[1;32m'       # Green
BYellow='e[1;33m'      # Yellow
BBlue='e[1;34m'        # Blue
BPurple='e[1;35m'      # Purple
BCyan='e[1;36m'        # Cyan
BWhite='e[1;37m'       # White

# Подчёркнутые
UBlack='e[4;30m'       # Black
URed='e[4;31m'         # Red
UGreen='e[4;32m'       # Green
UYellow='e[4;33m'      # Yellow
UBlue='e[4;34m'        # Blue
UPurple='e[4;35m'      # Purple
UCyan='e[4;36m'        # Cyan
UWhite='e[4;37m'       # White

# Фоновые
On_Black='e[40m'       # Black
On_Red='e[41m'         # Red
On_Green='e[42m'       # Green
On_Yellow='e[43m'      # Yellow
On_Blue='e[44m'        # Blue
On_Purple='e[45m'      # Purple
On_Cyan='e[46m'        # Cyan
On_White='e[47m'       # White

# Высоко Интенсивные
IBlack='e[0;90m'       # Black
IRed='e[0;91m'         # Red
IGreen='e[0;92m'       # Green
IYellow='e[0;93m'      # Yellow
IBlue='e[0;94m'        # Blue
IPurple='e[0;95m'      # Purple
ICyan='e[0;96m'        # Cyan
IWhite='e[0;97m'       # White

# Жирные Высоко Интенсивные
BIBlack='e[1;90m'      # Black
BIRed='e[1;91m'        # Red
BIGreen='e[1;92m'      # Green
BIYellow='e[1;93m'     # Yellow
BIBlue='e[1;94m'       # Blue
BIPurple='e[1;95m'     # Purple
BICyan='e[1;96m'       # Cyan
BIWhite='e[1;97m'      # White

# Высоко Интенсивные фоновые
On_IBlack='e[0;100m'   # Black
On_IRed='e[0;101m'     # Red
On_IGreen='e[0;102m'   # Green
On_IYellow='e[0;103m'  # Yellow
On_IBlue='e[0;104m'    # Blue
On_IPurple='e[0;105m'  # Purple
On_ICyan='e[0;106m'    # Cyan
On_IWhite='e[0;107m'   # White

Для использования в командах в окружении вашего shell:

$ echo -e «${txtblu}test»
test
$ echo -e «${bldblu}test»
test
$ echo -e «${undblu}test»
test
$ echo -e «${bakblu}test»
test
$ _
PS1="[$txtblu]foo[$txtred] bar[$txtrst] baz : "

Двойные кавычки позволяют разрешить переменную $color, а управляющие [ ] вокруг них позволяют не учитывать их при расчёте количества символов, поэтому позиция курсора будет верной.

Примечание: Если у вас возникает преждевременный перенос строки при наборе команды, скорее всего причиной является пропущенные управляющие последовательности ([ ]).

Прерывания приглашения

Некоторые прерывания приглашения Bash перечислены в man странице:

Bash allows these prompt strings to be customized by inserting a
number of *backslash-escaped special characters* that are
decoded as follows:

	a		an ASCII bell character (07)
	d		the date in "Weekday Month Date" format (e.g., "Tue May 26")
	D{format}	the format is passed to strftime(3) and the result
			  is inserted into the prompt string an empty format
			  results in a locale-specific time representation.
			  The braces are required
	e		an ASCII escape character (033)
	h		the hostname up to the first `.'
	H		the hostname
	j		the number of jobs currently managed by the shell
	l		the basename of the shell's terminal device name
	
		newline
	r		carriage return
	s		the name of the shell, the basename of $0 (the portion following
			  the final slash)
	t		the current time in 24-hour HH:MM:SS format
	T		the current time in 12-hour HH:MM:SS format
	@		the current time in 12-hour am/pm format
	A		the current time in 24-hour HH:MM format
	u		the username of the current user
	v		the version of bash (e.g., 2.00)
	V		the release of bash, version + patch level (e.g., 2.00.0)
	w		the current working directory, with $HOME abbreviated with a tilde
	W		the basename of the current working directory, with $HOME
			 abbreviated with a tilde
	!		the history number of this command
	#		the command number of this command
	$		if the effective UID is 0, a #, otherwise a $
	
nn		the character corresponding to the octal number nnn
	\		a backslash
	[		begin a sequence of non-printing characters, which could be used
			  to embed a terminal control sequence into the prompt
	]		end a sequence of non-printing characters

	The command number and the history number are usually different:
	the history number of a command is its position in the history
	list, which may include commands restored from the history file
	(see HISTORY below), while the command number is the position in
	the sequence of commands executed during the current shell session.
	After the string is decoded, it is expanded via parameter
	expansion, command substitution, arithmetic expansion, and quote
	removal, subject to the value of the promptvars shell option (see
	the description of the shopt command under SHELL BUILTIN COMMANDS
	below).

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

Эта последовательность устанавливает позицию курсора:

[33[<row>;<column>f]

Текущая позиция может быть сохранена так:

[33[s]

Чтобы восстановить позицию, используйте:

[33[u]

Следующий пример использует эти последовательности, чтобы отображать время в правом верхнем углу:

PS1=">[33[s][33[1;$((COLUMNS-5))f]$(date +%H:%M)[33[u]"

Переменная окружения COLUMNS содержит число столбцов в терминале. В примере выше из этого значения отнимается 5, чтобы выровнять 5-символьный вывод команды date по правому краю.

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

Используйте следующий промпт, чтобы видеть какое значение вернула последняя команда:

0 ;)  : true
0 ;)  : false
1 ;( :

#return value visualisation
PS1="$? $(if [[ $? == 0 ]]; then echo "[33[0;32m];)"; else echo "[33[0;31m];("; fi)[33[00m] : "

Ноль — зелёный смайлик, а не ноль — красный. Таким образом, ваше приглашение будет со смайликом, если последняя операция была успешной.

Но вы возможно также захотите использовать имя пользователя и хоста, например так:

0 ;) andy@alba ~ $ true
0 ;) andy@alba ~ $ false
1 ;( andy@alba ~ $ _

#return value visualisation
PS1="[33[01;37m]$? $(if [[ $? == 0 ]]; then echo "[33[01;32m];)"; else echo "[33[01;31m];("; fi) $(if [[ ${EUID} == 0 ]]; then echo '[33[01;31m]h'; else echo '[33[01;32m]u@h'; fi)[33[01;34m] w $[33[00m] "

Или, если вы хотите создать ваш промпт с использованием юникод-символа ✓ для статуса ноль и юникод-символ ✗ для статуса не ноль:

0 ✓ andy@alba ~ $ true
0 ✓ andy@alba ~ $ false
1 ✗ andy@alba ~ $ I will try to type a wrong command…
bash: I will try to type a wrong command…: command not found
127 ✗ andy@alba ~ $ _

#return value visualisation
PS1="[33[01;37m]$? $(if [[ $? == 0 ]]; then echo "[33[01;32m]342234223"; else echo "[33[01;31m]342234227"; fi) $(if [[ ${EUID} == 0 ]]; then echo '[33[01;31m]h'; else echo '[33[01;32m]u@h'; fi)[33[01;34m] w $[33[00m] "

Альтернативно, это можно сделать более читабельно при помощи PROMPT_COMMAND:

set_prompt () {
    Last_Command=$? # Must come first!
    Blue='[e[01;34m]'
    White='[e[01;37m]'
    Red='[e[01;31m]'
    Green='[e[01;32m]'
    Reset='[e[00m]'
    FancyX='342234227'
    Checkmark='342234223'

    # Add a bright white exit status for the last command
    PS1="$White$? "
    # If it was successful, print a green check mark. Otherwise, print
    # a red X.
    if [[ $Last_Command == 0 ]]; then
        PS1+="$Green$Checkmark "
    else
        PS1+="$Red$FancyX "
    fi
    # If root, just print the host in red. Otherwise, print the current user
    # and host in green.
    if [[ $EUID == 0 ]]; then
        PS1+="$Red\h "
    else
        PS1+="$Green\u@\h "
    fi
    # Print the working directory and prompt marker in blue, and reset
    # the text color to the default.
    PS1+="$Blue\w \$$Reset "
}
PROMPT_COMMAND='set_prompt'

Вот пример, который показывает статус ошибки только в случае не нулевого статуса:

PROMPT_COMMAND='es=$?; [[ $es -eq 0 ]] && unset error || error=$(echo -e "e[1;41m $es e[40m")'
PS1="${error} ${PS1}"

Советы и подсказки

Разные цвета при вводе текста и при выводе

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

~/.bashrc trap 'printf "e[0m" "$_"' DEBUG

Случайные цитаты при входе

Для коричневого приглашения Fortune добавьте:

~/.bashrc

[[ "$PS1" ]] && echo -e "e[00;33m$(/usr/bin/fortune)e[00m"

Раскрашенные последние новости Arch при входе

Чтобы читать 10 latestпоследних пунктов новостей с Arch official website, пользователь grufo написал маленький и цветной скрипт для извлечения RSS (scrollable):

   :: Arch Linux: Recent news updates ::
 [ https://www.archlinux.org/news/ ]

The latest and greatest news from the Arch Linux distribution.

 en-us Sun, 04 Nov 2012 16:09:46 +0000

   :: End of initscripts support ::
 [ https://www.archlinux.org/news/end-of-initscripts-support/ ]

Tom Gundersen wrote:
As systemd is now the default init system, Arch Linux is receiving minimal testing on initscripts systems. Due to a lack of resources and interest, we are unlikely to work on fixing initscripts-specific bugs, and may close them as WONTFIX.
We therefore strongly encourage all users to migrate to systemd as soon as possible. See the systemd migration guide [ https://wiki.archlinux.org/index.php/Systemd ].
To ease the transition, initscripts support will remain in the official repositories for the time being, unless otherwise stated. As of January 2013, we will start removing initscripts support (e.g., rc scripts) from individual packages without further notice.

 Tom Gundersen Sun, 04 Nov 2012 16:09:46 +0000 tag:www.archlinux.org,2012-11-04:/news/end-of-initscripts-support/

   :: November release of install media available ::
 [ https://www.archlinux.org/news/november-release-of-install-media-available/ ]

Pierre Schmitz wrote:
The latest snapshot of our install and rescue media can be found on our Download [ https://www.archlinux.org/download/ ] page. The 2012.11.01 ISO image mainly contains minor bug fixes, cleanups and new packages compared to the previous one:
 * First media with Linux 3.6
 * copytoram=n can be used to not copy the image to RAM on network boot. This is probably unreliable but an option for systems with very low memory.
 * cowfile_size boot parameter mainly for persistent COW on VFAT. See the README [ https://projects.archlinux.org/archiso.git/plain/docs/README.bootparams?id=v4 ] file for details.

 Pierre Schmitz Fri, 02 Nov 2012 17:54:15 +0000 tag:www.archlinux.org,2012-11-02:/news/november-release-of-install-media-available/

   :: Bug Squashing Day: Saturday 17th November ::
 [ https://www.archlinux.org/news/bug-squashing-day-saturday-17th-november/ ]

Allan McRae wrote:
The number of bugs in the Arch Linux bug tracker is creeping up so it is time for some extermination.
This is a great way for the community to get involved and help the Arch Linux team. The process is simple. First look at a bug for your favorite piece of software in the bug tracker and check if it still occurs. If it does, check the upstream project for a fix and test it to confirm it works. If there is no fix available, make sure the bug has been filed in the upstream tracker.
Join us on the #archlinux-bugs IRC channel. We are spread across timezones, so people should be around all day.

 Allan McRae Thu, 01 Nov 2012 12:28:51 +0000 tag:www.archlinux.org,2012-11-01:/news/bug-squashing-day-saturday-17th-november/

   :: ConsoleKit replaced by logind ::
 [ https://www.archlinux.org/news/consolekit-replaced-by-logind/ ]

Allan McRae wrote:
With GNOME 3.6, polkit and networkmanager moving to [extra], ConsoleKit has now been removed from the repositories. Any package that previously depended on it now relies on systemd-logind instead. That means that the system must be booted with systemd to be fully functional.
In addition to GNOME, both KDE and XFCE are also affected by this change.

 Allan McRae Tue, 30 Oct 2012 22:17:39 +0000 tag:www.archlinux.org,2012-10-30:/news/consolekit-replaced-by-logind/

   :: systemd is now the default on new installations ::
 [ https://www.archlinux.org/news/systemd-is-now-the-default-on-new-installations/ ]

Thomas Bächler wrote:
The base group now contains the systemd-sysvcompat package. This means that all new installations will boot with systemd by default.
As some packages still lack native systemd units, users can install the initscripts package and use the DAEMONS array in /etc/rc.conf to start services using the legacy rc.d scripts.
This change does not affect existing installations. For the time being, the initscripts and sysvinit packages remain available from our repositories. However, individual packages may now start relying on the system being booted with systemd.
Please refer to the wiki [ https://wiki.archlinux.org/index.php/Systemd ] for how to transition an existing installation to systemd.

 Thomas Bächler Sat, 13 Oct 2012 09:29:38 +0000 tag:www.archlinux.org,2012-10-13:/news/systemd-is-now-the-default-on-new-installations/

   :: Install medium 2012.10.06 introduces systemd ::
 [ https://www.archlinux.org/news/install-medium-20121006-introduces-systemd/ ]

Pierre Schmitz wrote:
The October release of the Arch Linux install medium is available for Download [ https://www.archlinux.org/download/ ] and can be used for new installs or as a rescue system. It contains a set of updated packages and the following notable changes:
 * systemd is used to boot up the live system.
 * initscripts are no longer available on the live system but are still installed by default on the target system. This is likely to change in the near future.
 * EFI boot and setup has been simplified.
 * gummiboot is used to display a menu on EFI systems.
 * The following new packages are available on the live system: ethtool, fsarchiver, gummiboot-efi, mc, partclone, partimage, refind-efi, rfkill, sudo, testdisk, wget, xl2tpd

 Pierre Schmitz Sun, 07 Oct 2012 16:58:03 +0000 tag:www.archlinux.org,2012-10-07:/news/install-medium-20121006-introduces-systemd/

   :: New install medium 2012.09.07 ::
 [ https://www.archlinux.org/news/new-install-medium-20120907/ ]

Pierre Schmitz wrote:
As is customary by now there is a new install medium available at the beginning of this month. The live system can be downloaded from Download [ https://www.archlinux.org/download/ ] and be used for new installs or as a rescue system.
In addition to a couple of updated packages and bug fixes the following changes stand out:
 * First medium with Linux 3.5 (3.5.3)
 * The script boot parameter works again (FS#31022 [ https://bugs.archlinux.org/task/31022 ])
 * When booting via PXE and NFS or NBD the ISO will be copied to RAM to ensure a more stable usage.
 * The live medium contains usb_modeswitch and wvdial which e.g. allows to establish a network connection using an UMTS USB dongle
 * Furthermore the newest versions of initscripts, systemd and netcfg are included.

 Pierre Schmitz Sat, 08 Sep 2012 09:48:52 +0000 tag:www.archlinux.org,2012-09-08:/news/new-install-medium-20120907/

   :: Fontconfig 2.10.1 update — manual intervention required ::
 [ https://www.archlinux.org/news/fontconfig-2101-update-manual-intervention-required/ ]

Andreas Radke wrote:
The fontconfig 2.10.1 update overwrites symlinks created by the former package version. These symlinks need to be removed before the update:

rm /etc/fonts/conf.d/20-unhint-small-vera.conf
rm /etc/fonts/conf.d/20-fix-globaladvance.conf
rm /etc/fonts/conf.d/29-replace-bitmap-fonts.conf
rm /etc/fonts/conf.d/30-metric-aliases.conf
rm /etc/fonts/conf.d/30-urw-aliases.conf
rm /etc/fonts/conf.d/40-nonlatin.conf
rm /etc/fonts/conf.d/45-latin.conf
rm /etc/fonts/conf.d/49-sansserif.conf
rm /etc/fonts/conf.d/50-user.conf
rm /etc/fonts/conf.d/51-local.conf
rm /etc/fonts/conf.d/60-latin.conf
rm /etc/fonts/conf.d/65-fonts-persian.conf
rm /etc/fonts/conf.d/65-nonlatin.conf
rm /etc/fonts/conf.d/69-unifont.conf
rm /etc/fonts/conf.d/80-delicious.conf
rm /etc/fonts/conf.d/90-synthetic.conf
pacman -Syu fontconfig

Main systemwide configuration should be done by symlinks (especially for autohinting, sub-pixel and lcdfilter):

cd /etc/fonts/conf.d
ln -s ../conf.avail/XX-foo.conf

Also check Font Configuration [ https://wiki.archlinux.org/index.php/Font_Configuration ] and Fonts [ https://wiki.archlinux.org/index.php/Fonts ].

 Andreas Radke Thu, 06 Sep 2012 13:54:23 +0000 tag:www.archlinux.org,2012-09-06:/news/fontconfig-2101-update-manual-intervention-required/

   :: netcfg-2.8.9 drops deprecated rc.conf compatibility ::
 [ https://www.archlinux.org/news/netcfg-289-drops-initscripts-compatibility/ ]

Florian Pritz wrote:
Users of netcfg should configure all interfaces in /etc/conf.d/netcfg rather than /etc/rc.conf.

 Florian Pritz Sat, 11 Aug 2012 20:00:02 +0000 tag:www.archlinux.org,2012-08-11:/news/netcfg-289-drops-initscripts-compatibility/

   :: Install media 2012.08.04 available ::
 [ https://www.archlinux.org/news/install-media-20120804-available/ ]

Pierre Schmitz wrote:
The August snapshot of our live and install media comes with updated packages and the following changes on top of the previous ISO image [ /news/install-media-20120715-released/ ]:
 * GRUB 2.0 instead of the legacy 0.9 version is available.
 * The Installation Guide [ https://wiki.archlinux.org/index.php/Installation_Guide ] can be found at /root/install.txt.
 * ZSH with Grml’s configuration [ http://grml.org/zsh/ ] is used as interactive shell to provide a user friendly and more convenient environment. This includes completion support for pacstrap, arch-chroot, pacman and most other tools.
 * The network daemon is started by default which will automatically setup your network if DHCP is available.
Note that all these changes only affect the live system and not the base system you install using pacstrap. The ISO image can be downloaded from our download page [ /download/ ]. The next snapshot is scheduled for September.

 Pierre Schmitz Sat, 04 Aug 2012 17:24:30 +0000 tag:www.archlinux.org,2012-08-04:/news/install-media-20120804-available/

andy@alba _
~/.bashrc

# Arch latest news
if [ "$PS1" ] && [[ $(ping -c1 www.google.com 2>&-) ]]; then
	# The characters "£, §" are used as metacharacters. They should not be encountered in a feed...
	echo -e "$(echo $(curl --silent https://www.archlinux.org/feeds/news/ | sed -e ':a;N;$!ba;s/
/ /g') | 
		sed -e 's/&amp;/&/g
		s/&lt;|</</g
		s/&gt;|>/>/g
		s/</a>/£/g
		s/href="/§/g
		s/<title>/


   :: \e[01;31m/g; s/</title>/\e[00m ::
/g
		s/<link>/ [ \e[01;36m/g; s/</link>/\e[00m ]/g
		s/<description>/

\e[00;37m/g; s/</description>/\e[00m

/g
		s/<p( [^>]*)?>|<brs*/?>/
/g
		s/<b( [^>]*)?>|<strong( [^>]*)?>/\e[01;30m/g; s/</b>|</strong>/\e[00;37m/g
		s/<i( [^>]*)?>|<em( [^>]*)?>/\e[41;37m/g; s/</i>|</em>/\e[00;37m/g
		s/<u( [^>]*)?>/\e[4;37m/g; s/</u>/\e[00;37m/g
		s/<code( [^>]*)?>/\e[00m/g; s/</code>/\e[00;37m/g
		s/<a[^§|t]*§([^"]*)"[^>]*>([^£]*)[^£]*£/\e[01;31m2\e[00;37m \e[01;34m[\e[00;37m \e[04m1\e[00;37m\e[01;34m ]\e[00;37m/g
		s/<li( [^>]*)?>/
 \e[01;34m*\e[00;37m /g
		s/<![CDATA[|]]>//g
		s/|>s*<//g
		s/ *<[^>]+> */ /g
		s/[<>£§]//g')

";
fi

Чтобы получить только самую последнюю новость, воспользуйтесь этим:

# Arch latest news
if [ "$PS1" ] && [[ $(ping -c1 www.google.com 2>&-) ]]; then
	# The characters "£, §" are used as metacharacters. They should not be encountered in a feed...
	echo -e "$(echo $(curl --silent https://www.archlinux.org/feeds/news/ | awk ' NR == 1 {while ($0 !~ /</item>/) {print;getline} sub(/</item>.*/,"</item>") ;print}' | sed -e ':a;N;$!ba;s/
/ /g') | 
		sed -e 's/&amp;/&/g
		s/&lt;|</</g
		s/&gt;|>/>/g
		s/</a>/£/g
		s/href="/§/g
		s/<title>/


   :: \e[01;31m/g; s/</title>/\e[00m ::
/g
		s/<link>/ [ \e[01;36m/g; s/</link>/\e[00m ]/g
		s/<description>/

\e[00;37m/g; s/</description>/\e[00m

/g
		s/<p( [^>]*)?>|<brs*/?>/
/g
		s/<b( [^>]*)?>|<strong( [^>]*)?>/\e[01;30m/g; s/</b>|</strong>/\e[00;37m/g
		s/<i( [^>]*)?>|<em( [^>]*)?>/\e[41;37m/g; s/</i>|</em>/\e[00;37m/g
		s/<u( [^>]*)?>/\e[4;37m/g; s/</u>/\e[00;37m/g
		s/<code( [^>]*)?>/\e[00m/g; s/</code>/\e[00;37m/g
		s/<a[^§|t]*§([^"]*)"[^>]*>([^£]*)[^£]*£/\e[01;31m2\e[00;37m \e[01;34m[\e[00;37m \e[04m1\e[00;37m\e[01;34m ]\e[00;37m/g
		s/<li( [^>]*)?>/
 \e[01;34m*\e[00;37m /g
		s/<![CDATA[|]]>//g
		s/|>s*<//g
		s/ *<[^>]+> */ /g
		s/[<>£§]//g')

";
fi

Просмотр цветов

Страница по адресу http://ascii-table.com/ansi-escape-sequences.php описывает некоторые доступные цветовые последовательности. Следующая Bash функция отображает таблицу с готовыми к копированию управляющими кодами.

~/.bashrc

colors() {
	local fgc bgc vals seq0

	printf "Color escapes are %s
" 'e[${value};...;${value}m'
	printf "Values 30..37 are e[33mforeground colorse[m
"
	printf "Values 40..47 are e[43mbackground colorse[m
"
	printf "Value  1 gives a  e[1mbold-faced looke[m

"

	# foreground colors
	for fgc in {30..37}; do
		# background colors
		for bgc in {40..47}; do
			fgc=${fgc#37} # white
			bgc=${bgc#40} # black

			vals="${fgc:+$fgc;}${bgc}"
			vals=${vals%%;}

			seq0="${vals:+e[${vals}m}"
			printf "  %-9s" "${seq0:-(default)}"
			printf " ${seq0}TEXTe[m"
			printf " e[${vals:+${vals+$vals;}}1mBOLDe[m"
		done
		echo; echo
	done
}

Раскрашенное git приглашение

Укажите /usr/share/git/completion/git-prompt.sh вашему шеллу:

~/.bashrc

source /usr/share/git/completion/git-prompt.sh

и используйте __git_ps1 внутри PS1 или PROMPT_COMMAND. Смотрите Don’t Reinvent the Wheel для подробностей.

Раскрашенные существующие бесцветные приглашения

Добавьте в свой ~/.bashrc:

~/.bashrc

# Colorize prompts
for i in {1..4}; do
	PSi="PS$i"
	export $PSi="[e[1;37m]${!PSi}[e[0m]"
done
unset PSi
unset i

Смотрите также

  • Community examples and screenshots in the Forum thread: What’s your PS1?
  • The original not modified Gentoo’s /etc/bash.bashrc file can be found here. See also the gentoo-bashrc package from AUR.
  • tput(1)
    • tput reference on bash-hackers.org
    • Colours and Cursor Movement With tput
  • Nice Xresources color schemes collection
  • Bash Prompt HOWTO
  • Giles Orr’s collection of sample prompts
  • Bash tips: Colors and formatting

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

[user@hostname ~]$

Строка содержит имя пользователя, имя хоста (сетевое имя компьютера) и имя текущего рабочего каталога. Форма приглашения к вводу определяется в переменной окружения PS1 (сокращенно от prompt string 1 — строка приглашения 1). Увидеть содержимое переменной PS1 можно с помощью команды echo. Увидим приблизительно следующие

 echo $PS1
[u@h W]$

Nota Bene! Если вывод отличающееся от примера, приведенного выше, пужаться не стоит. Все дистрибутивы Linux определяют приглашение к вводу по-своему, а некоторые содержат весьма экзотические определения.

Экранированные последовательности, используемые в строке приглашения

Символы Отображаемое значение
a Звонок. Заставляет компьютер издавать звуковой сигнал
d Текущая дата в формате: день недели месяц число; например, «Mon May 26» (Пн Май 26)
h Имя хоста локальной машины минус имя домена
H Полное имя хоста
j Число заданий, действующих в текущем сеансе
l Имя текущего устройства терминала
n Символ перевода строки
r Возврат каретки
s Имя программы командной оболочки
t Текущее время в 24-часовом формате
T Текущее время в 12-часовом формате
@ Текущее время в 12-часовом формате AM/PM
A Текущее время в 24-часовом формате, часы:минуты
u Имя пользователя
v Номер версии командной оболочки
V Номер версии и выпуска командной оболочки
w Имя текущего рабочего каталога
W Последняя часть в имени текущего рабочего каталога
! Номер текущей команды в истории
# Число команд, введенных в текущем сеансе командной оболочки
$ Выводит символ $, если пользователь не является суперпользователем, иначе выводит символ
[ Отмечает начало последовательности из одного или более непечатаемых символов. Используется для внедрения непечатаемых символов, управляющих поведением эмулятора терминала, например, перемещает курсор или изменяет цвет текста
] Отмечает конец последовательности непечатаемых символов

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

ps1_old="$PS1"

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

PS1="$ps1_old"

Теперь, когда все готово, давайте посмотрим, что получится, если определить пустую строку приглашения:

PS1=

Если определить приглашение как пустую строку, то – ничего не увидим. Это несколько дезориентирует, так что внесем минимальное оформление.

PS1="$ "
$

Так лучше. По крайней мере, теперь видно, кто мы. Но, пользователя, под которым работаем, теперь можно только через команду whoami.

Добавим в строку приглашения сигнал:

$ PS1="[a]$ "

Теперь при каждом выводе строки приглашения, будем слышать короткий звуковой сигнал. Обратите внимание, что были добавлены последовательности [ и ]. Поскольку управляющий ASCII-символ «звонок» a не является «печатаемым», то есть не перемещает курсор при выводе, мы должны сообщить об этом командной оболочке bash, чтобы та могла правильно определить длину строки приглашения.

А теперь сварганим более информативное приглашение, добавив имя хоста и время суток:

$ PS1="A h $ "
09:13 user $

Наконец, сделайте приглашение похожим на оригинально

$ PS1="<u@h W>$ "
<user@hostname ~>$

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

Цветом символов можно управлять, посылая эмулятору терминала экранированные последовательности ANSI внутри потока символов, предназначенных для вывода на экран. Экранированные последовательности не «выводятся» на экран; они
интерпретируются терминалом как инструкции. Как показано в таблицу выше, для включения непечатаемых символов используются последовательности [ и ]. Экранированные последовательности ANSI начинаются с восьмеричного кода 033 (код, генерируемый клавишей ESC), за которым следует необязательный атрибут символа и инструкция. Например, вот как выглядит код, определяющий текст как простой (атрибут = 0), черного цвета – 33[0;30m

В таблице перечислены поддерживаемые цвета текста.

Nota Bene! Обратите внимание, что цвета делятся на две группы, отличаясь наличием атрибута жирного текста 1,
из-за которого возникает впечатление более «светлых» (light) цветов.

Последовательность Цвет Последовательность Цвет
33[0;30m Черный 33[1;30m Темно-серый
33[0;31m Красный 33[1;31m Светло-красный
33[0;32m Зеленый 33[1;32m Светло-зеленый
33[0;33m Коричневый 33[1;33m Желтый
33[0;34m Синий 33[1;34m Светло-синий
33[0;35m Пурпурный 33[1;35m Светло-пурпурный
33[0;36m Бирюзовый 33[1;36m Светло-бирюзовый
33[0;37m Светло-серый 33[1;37m Белый

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

<vs@v0id ~>$ PS1="[33[0;31m]<u@h W>$ "

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

PS1="[33[0;31m]<u@h W>$[33[0m] "

Красота!

Кроме того, существует возможность изменить цвет фона, для чего предназначены экранированные последовательности. Цвет фона не поддерживает атрибут жирного текста.

Последовательность Цвет Последовательность Цвет
33[0;40m Черный 33[1;44m Синий
33[0;41m Красный 33[1;45m Пурпурный
33[0;42m Зеленый 33[1;46m Бирюзовый
33[0;43m Коричневый 33[1;47m Светло-серый

Чтобы вывести приглашение на красном фоне, достаточно изменить первую экранированную последовательность:

 PS1="[33[0;41m]<u@h W>$[33[0m] "

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

Экранированные последовательности, управляющие позицией курсора

Последовательность Действие
33[l;cH Перемещает курсор в строку l и позицию c
33[nA Перемещает курсор вверх на n строк
33[nB Перемещает курсор вниз на n строк
33[nC Перемещает курсор вперед на n символов
33[nD Перемещает курсор назад на n символов
33[2J Очищает экран и помещает курсор в левый верхний угол (строка 0, позиция 0)
33[K Очищает экран от позиции курсора до конца текущей строки
33[s Сохраняет текущую позицию курсора
33[u Восстанавливает сохраненную позицию курсора

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

PS1="[33[s33[0;0H33[0;41m33[K33[1;33mt33[0m33[u]<u@h W>$ "

Ниже приведены отдельные части этого определения, которые помогут понять, как это работает.

Последовательность Действие
[ Начинает последовательность непечатаемых символов. Истинное назначение этой последовательности – позволить bash правильно вычислить длину строки приглашения на экране. Без этого функция редактирования командной строки неправильно позиционировала бы курсор
33[s Сохраняет позицию курсора. Это необходимо, чтобы вернуться в местоположение строки приглашения после вывода прямоугольника с часами в верхней части экрана. Будьте внимательны: некоторые эмуляторы терминалов не поддерживают эту последовательность
33[0;0H Перемещает курсор в левый верхний угол, в строку 0, позицию 0
33[0;41m Устанавливает красный цвет фона
33[K Очищает экран от текущей позиции курсора (в левом верхнем углу) до конца строки. Поскольку теперь установлен красный цвет фона, строка окрашивается в красный цвет. Обратите внимание, что последовательность очистки экрана до конца строки не изменяет позицию курсора, который остается в левом верхнем углу
33[1;33m Устанавливает желтый цвет текста
t Выводит текущее время. Хотя это «печатаемый» элемент, он находится в непечатаемом блоке строки приглашения, потому что нам не нужно, чтобы командная оболочка bash учитывала размер часов при расчете истинного размера отображаемой строки приглашения
33[0m Выключает цвет. Сбрасывает настройки цвета для текста и фона
33[u Восстанавливает позицию курсора, сохраненную ранее
] Завершает последовательность непечатаемых символов
<u@h W>$ Строка приглашения

Для сохранения определение можно в файле .bashrc. Для этого добавьте следующие две строки в файл:

PS1="[33[s33[0;0H33[0;41m33[K33[1;33mt33[0m33[u]<u@h W>$ "
export PS1

Приглашение в командной среде bash изменяется при помощи изменения переменных PS1, PS2, PS3, PS4 и PROMPT_COMMAND.

  • PS1 — переменная, которая задает вид строки приглашения командной строки, которое bash выводит, когда ожидает ввода очередной команды пользователем.
  • PS2 — переменная, отвечающая за вторичный тип приглашения ввода.
  • PS3 — третичное приглашение, выводится тогда, когда пользователь должен сделать выбор в операторе select.
  • PS4 — приглашение четвертого уровня, выводится при отладки сценариев (скриптов) в начале каждой строки перед командой перед исполняющейся командой.
  • PROMPT_COMMAND — содержимое этой переменной выполняется перед каждой строкой приглашения.

Для того чтобы узнать текущие значения этих переменных можно воспользоваться командой echo.

echo $PS1

Вывод будет примерно следующим:

[e]0;u@h: wa]${debian_chroot:+($debian_chroot)}u@h:w$

Для изменения переменной можно пользоваться командой export. Например:

export PS1='u@w : '

Изменит приглашение на такое:

user@~ :

Другим методом изменения данных переменных является задание из в конце файла ~/.bashrc. Это делается таким образом:

PS1 = "u@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)
  • [ — Начало последовательности не печатаемых символов (этот символ может быть использован для того, чтобы включить в текст подсказки последовательность управляющих символов терминала)
  • ] — Конец последовательности не печатаемых символов

Изменение цвета строки приглашения:
Изменение цвета строки приглашения командной оболочки делается при помощи последовательности

[е[#;##m]
  • # — номер свойства цвета
  • ## — номер цвета

Номера свойств текста:

Свойство Код
Значение по умолчанию
Повышенная яркость 1
Пониженная яркость 2
Подчеркнутый 4
Нормальная яркость 5
Инвертированный 7
Скрытый 8

Номера цветов:

Цвет Текст Фон
Черный 30 40
Красный 31 41
Зеленый 32 42
Желтый 33 43
Синий 34 44
Фиолетовый 35 45
Голубой 36 46
Белый 37 47

Например такая последовательность:

[e[1;37m] u: [e[0;37m]

Настроит строку приглашения следующим образом:

Как видно из примера управляющая последовательность изменяет свойства всего текста после неё и до другой последовательности.
Таким же образом устанавливается цвет фона и текста, но параметры дублированы. Первые два для фона, вторые — для текста:

[е[#;##;#;##m]

Переменная PS2:
Содержимое переменной PS2 появляется на экране терминала при переносе ввода команды на следующую строку. Например:

Метод изменения переменных одинаков, не будем останавливаться на каждой отдельно.
Переменная PS3: Этот вид приглашения используется в скриптах, когда нужно сделать выбор при использовании оператора select.
Переменная PROMPT_COMMAND: Эта переменная используется для помещения какого либо выражения перед каждой строкой приглашения терминала:
Например если поместить в неё команду ls:

export PROMPT_COMMAND='ls'

То перед каждой строкой приглашения выведется список файлов текущей папки:

Для более подробной информации вы можете воспользоваться справочным руководством:

man bash

Большинство систем Ubuntu используют bash или dash в качестве приложения терминала по умолчанию. Вы вводите команды в стандартной командной строке, которая обычно отображает ваше имя пользователя, имя хоста и текущий каталог в предопределенной цветовой схеме. Bash предоставляет множество опций настройки командной строки, которые позволяют не только добавлять различные функции в приглашение терминала, но и различать их разными цветами.

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

Содержание

  1. Просмотр текущей конфигурации интерпретатора Bash
  2. Настройка оболочки
  3. Установка значения настроек приглашения терминала по умолчанию
  4. Что еще можно настроить?
  5. Изменение цвета приглашения
  6. Установка цветов в приглашении bash
  7. Использование стилей текста в приглашении
  8. Внесение постоянных изменений в приглашение

Просмотр текущей конфигурации интерпретатора Bash

Когда вы открываете терминал через Dash или сочетание клавиш Ctrl+Alt +T, вы видите следующее приглашение:

[email protected]:directory$

Подсказка Bash

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

Расположение: /home/username/.bashrc

Вы также можете использовать любой другой текстовый редактор для открытия этого файла.

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

Файл .bashrc, открытый в nano

Переменная PS1, которую вы видите на рисунке выше, содержит все необходимые настройки для приглашения bash. Давайте сначала объясним, что обозначают символы в этой переменной. Вы можете увидеть эту переменную в переменной PS1, указанной после оператора else.

u- Это указывает на имя пользователя текущего пользователя
h: Это указывает на имя хоста текущего пользователя, извлеченное из полного доменного имени.
w: Указывает текущий рабочий каталог. Ваш домашний каталог обозначается символом тильды ~.
$: Указывает, являетесь ли вы обычным пользователем ($) или пользователем root (#).

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

Переменная PS1

Настройка оболочки

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

Прежде чем редактировать переменную PS1, важно сохранить ее содержимое по умолчанию в новой переменной. Это поможет нам восстановить исходную конфигурацию приглашения, если что-то пойдет не так. Введите следующую команду в терминале:

Теперь в переменной «DEFAULT» есть вся информация, необходимая для восстановления стандартных настроек.

Теперь давайте немного поэкспериментируем с нашей переменной PS1. Введите следующую команду:

Это новое значение PS1 окажет следующий эффект на вашу приглашение терминала:

Новая подсказка Bash

Теперь вы можете видеть только имя пользователя и информацию о пользователе root без каких-либо цветов, так как информация о цвете еще не задана.

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

Это новое значение PS1 окажет следующий эффект на приглашение терминала:

Новая подсказка bash в действии

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

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

PS1=$DEFAULT

Что еще можно настроить?

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

Пример:

Я настроил свой запрос на включение пользовательского сообщения следующим образом:

Установка пользовательского текста в приглашении bash

Вы можете включить в приглашение следующие основные символы:

Символы Назначение
d Дата в формате день месяц дата.
e Символ звонка.
a Символ эвакуации.
h Имя хоста текущего пользователя до ‘.’.
H Имя хоста текущего пользователя.
l Основное имя терминального устройства.
j Количество заданий, выполняемых оболочкой.
r Возврат каретки.
n Новая строка.
u Имя пользователя текущего пользователя.
v Версия Bash.
! Номер истории печати выполняемой команды.

Вы можете включить текущее системное время в приглашение с помощью следующей команды:

Это новое значение PS1 будет иметь следующий эффект:

Показать системное время в командной строке

Вы также можете настроить приглашение так, чтобы она включала вывод команды; это дает вам неограниченные возможности для включения.

Синтаксис:

Пример:

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

Включить имя основной группы

Изменение цвета приглашения

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

Для того чтобы добавить цвета к одной или нескольким характеристикам, в переменной PS1 предусмотрены цветовые теги. Выделенный текст на следующем рисунке — это цветовой тег.

Установка цветов в приглашении bash

Вот формат цветового тега:

Например, имя пользователя и имя хоста по умолчанию, которые мы видим в приглашении терминала по умолчанию, являются зелеными из-за следующего цветового тега:

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

Вот некоторые распространенные цвета и их значения:

Цвет Значение
Зеленый 32
Красный 31
Черный 30
Синий 34
Голубой 36
Фиолетовый 35
Желтый 33
Белый 37

Пример:

Следующая команда сделает текст командной строки красным, так как мы указываем 31 (красный цвет) в теге color:

Раскрасьте командную строку

Использование стилей текста в приглашении

Вы можете добавить стили к тексту приглашения, присвоив значение атрибута тегу color. Вот формат тега color с атрибутом:

[33[ATTRIBUTE; COLORm]

Вы можете использовать следующие значения атрибутов для текста приглашения:

Значение Назначение
0 Обычный текст (Это значение по умолчанию, даже если атрибут не установлен)
1 В терминале Ubuntu это значение определяет полужирный текст
2 Полужирный текст
4 Подчеркивание текста
5 Для мигающего текста
7 Меняет цвета текста и фона
8 Для скрытого текста

Пример:

Вы можете использовать следующую команду для того, чтобы подчеркнуть текст в bash:

Значение 4 указывает на то, что мы хотим «подчеркнуть» текст.

Использование стилей текста в командной строке

Внесение постоянных изменений в приглашение

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

Откройте файл .bashrc и скопируйте значение PS1, которое вы окончательно установили в строке PS1 под строкой if; then. На следующем изображении я только что изменил цвет приглашения bash на красный:

Редактирование файла .bashrc

Сохраните файл, нажав Ctrl+X, а затем нажав Y. Изменения в приглашении bash теперь будут постоянными.

Выйдите из Терминала и откройте его снова, чтобы убедиться, что ваш интерпретатор bash по-прежнему будет таким, каким вы его установили.

Сохранение файла

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

Понравилась статья? Поделить с друзьями:
  • Как изменить привязку файлов
  • Как изменить привязку телефона к карте тинькофф
  • Как изменить привязку телефона к карте сбербанка
  • Как изменить привязку номера к карте сбербанка
  • Как изменить привязку номера к карте пятерочка