Приглашение ко вводу команд в bash — это строка, которая отображается слева от каждой команды, которую вы вводите в терминале. Обычно приглашение имеет вид пользователь@hostname:директория$
Приглашение можно настраивать. Можно добавлять информацию или, например, изменить цвет приглашения.
В какой переменной задается приглашение
Формат строки приглашения задается в переменной окружения 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
Перезапустите терминал. Приглашение для ввода команд будет обновлено.
Чтобы изменить PS1, вам просто нужно изменить значение переменной оболочки PS1. Значение может быть установлено в файле ~/.bashrc
или /etc/bashrc
, в зависимости от дистрибутива. PS1 можно изменить на любой простой текст, например:
PS1="hello "
Помимо обычного текста поддерживается несколько специальных символов с обратным слэшем:
Формат | действие |
---|---|
a |
символ колокола ASCII (07) |
d |
дата в формате «День недели месяца» (например, «Вт май 26») |
D{format} |
формат передается в strftime (3), и результат вставляется в строку приглашения; пустой формат приводит к представлению времени, специфичному для локали. Требуются скобки |
e |
ASCII escape-символ (033) |
h |
имя хоста до первого ‘.’ |
H |
имя хоста |
j |
количество рабочих мест, которыми в настоящее время управляет оболочка |
l |
базовое имя имени терминального устройства оболочки |
n |
новая линия |
r |
возврат каретки |
s |
имя оболочки, базовое имя $ 0 (часть, следующая за последней косой чертой) |
t |
текущее время в 24-часовом формате HH: MM: SS |
T |
текущее время в 12-часовом формате HH: MM: SS |
@ |
текущее время в 12-часовом формате am / pm |
A |
текущее время в 24-часовом формате HH: MM |
u |
имя пользователя текущего пользователя |
v |
версия bash (например, 2.00) |
V |
выпуск bash, версия + уровень патча (например, 2.00.0) |
w |
текущий рабочий каталог, с $ HOME сокращенно с тильдой |
W |
basename текущего рабочего каталога, с $ HOME сокращенно с тильдой |
! |
номер истории этой команды |
# |
номер команды этой команды |
$ |
если эффективный UID равен 0, a #, в противном случае $ |
nnn* |
символ, соответствующий восьмеричному числу nnn |
|
обратная косая черта |
[ |
начните последовательность непечатаемых символов, которые могут быть использованы для встраивания управляющей последовательности терминала в приглашение |
] |
завершение последовательности непечатаемых символов |
Так, например, мы можем установить PS1 в:
PS1="[email protected]h:w$ "
И он будет выводить:
пользователь @ машина: ~ $
Показать ветку git с помощью PROMPT_COMMAND
Если вы находитесь в папке git-репозитория, может быть приятно показать текущую ветку, в которой вы находитесь. В ~/.bashrc
или /etc/bashrc
добавьте следующее (для этого требуется git):
function prompt_command {
# Check if we are inside a git repository
if git status > /dev/null 2>&1; then
# Only get the name of the branch
export GIT_STATUS=$(git status | grep 'On branch' | cut -b 10-)
else
export GIT_STATUS=""
fi
}
# This function gets called every time PS1 is shown
PROMPT_COMMAND=prompt_command
PS1="$GIT_STATUS [email protected]h:w$ "
Если мы находимся в папке внутри репозитория git, это будет выводить:
branch user @ machine: ~ $
И если мы находимся внутри обычной папки:
пользователь @ машина: ~ $
Показать имя ветки git в приглашении терминала
У вас могут быть функции в переменной PS1, просто убедитесь, что она одинарная, или используйте escape для специальных символов:
gitPS1(){
gitps1=$(git branch 2>/dev/null | grep '*')
gitps1="${gitps1:+ (${gitps1/#* /})}"
echo "$gitps1"
}
PS1='[email protected]h:w$(gitPS1)$ '
Он даст вам следующее:
[email protected]:/path (master)$
Заметки:
- Внесите изменения в файлы
~/.bashrc
или/etc/bashrc
или~/.bash_profile
или~./profile
(в зависимости от ОС) и сохраните их. - Запустите
source ~/.bashrc
(distro specific) после сохранения файла.
Показывать время в командной строке терминала
timeNow(){
echo "$(date +%r)"
}
PS1='[$(timeNow)] [email protected]h:w$ '
Он даст вам следующее:
[05:34:37 PM] [email protected]:/path$
Заметки:
- Внесите изменения в файлы
~/.bashrc
или/etc/bashrc
или~/.bash_profile
или~./profile
(в зависимости от ОС) и сохраните их. - Запустите
source ~/.bashrc
(distro specific) после сохранения файла.
Раскрасить и настроить подсказку терминала
Так автор устанавливает свою личную переменную PS1
:
gitPS1(){
gitps1=$(git branch 2>/dev/null | grep '*')
gitps1="${gitps1:+ (${gitps1/#* /})}"
echo "$gitps1"
}
#Please use the below function if you are a mac user
gitPS1ForMac(){
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* (.*)/ (1)/'
}
timeNow(){
echo "$(date +%r)"
}
if [ "$color_prompt" = yes ]; then
if [ x$EUID = x0 ]; then
PS1='[33[1;38m][$(timeNow)][33[00m] [33[1;31m]u[33[00m][33[1;37m]@[33[00m][33[1;33m]h[33[00m] [33[1;34m]w[33[00m][33[1;36m]$(gitPS1)[33[00m] [33[1;31m]:/#[33[00m] '
else
PS1='[33[1;38m][$(timeNow)][33[00m] [33[1;32m]u[33[00m][33[1;37m]@[33[00m][33[1;33m]h[33[00m] [33[1;34m]w[33[00m][33[1;36m]$(gitPS1)[33[00m] [33[1;32m]:/$[33[00m] '
fi
else
PS1='[$(timeNow)] [email protected]h w$(gitPS1) :/$ '
fi
И вот как выглядит мое приглашение:
Ссылка цвета:
# Colors
txtblk='e[0;30m' # Black - Regular
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 - Bold
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 - Underline
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 - Background
bakred='e[41m' # Red
badgrn='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
Заметки:
-
Внесите изменения в файлы
~/.bashrc
или/etc/bashrc
или~/.bash_profile
или~./profile
(в зависимости от ОС) и сохраните их. -
Для
root
вам также может потребоваться отредактировать файл/etc/bash.bashrc
или/root/.bashrc
-
Запустите
source ~/.bashrc
(distro specific) после сохранения файла. -
Примечание: если вы сохранили изменения в
~/.bashrc
, не забудьте добавитьsource ~/.bashrc
в свой файл~/.bash_profile
чтобы это изменение вPS1
записывалось каждый раз, когда запускается приложение терминала.
Показать предыдущий статус и время возврата команды
Иногда нам нужен визуальный намек, указывающий статус возврата предыдущей команды. Следующий фрагмент делает его во главе PS1.
Обратите внимание, что функцию __stat () следует вызывать каждый раз, когда генерируется новый PS1, иначе он будет придерживаться статуса возврата последней команды вашего .bashrc или .bash_profile.
# -ANSI-COLOR-CODES- #
Color_Off="33[0m"
###-Regular-###
Red="33[0;31m"
Green="33[0;32m"
Yellow="33[0;33m"
####-Bold-####
function __stat() {
if [ $? -eq 0 ]; then
echo -en "$Green ✔ $Color_Off "
else
echo -en "$Red ✘ $Color_Off "
fi
}
PS1='$(__stat)'
PS1+="[t] "
PS1+="e[0;33m[email protected]he[0m:e[1;34mwe[0m n$ "
export PS1
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
Приглашение ко вводу команд в 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. |
\ | Символ обратной косой черты . |
[ | Начало последовательности непечатаемых символов. |
] | Конец последовательности. |
Приглашение в командной среде 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
Состояние перевода: На этой странице представлен перевод статьи Bash/Prompt customization. Дата последней синхронизации: 10 июля 2021. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
В Bash существует несколько приглашений командной строки, каждое из которых можно настроить на основе личных представлений об удобстве и эстетичности.
Приглашения
Bash имеет четыре строки приглашения, каждая из которых может быть настроена.
PS1
— основное приглашение, которое отображается перед каждой командой; по этой причине модифицируется чаще всего.PS2
— второе приглашение, отображается, если команде требуются дополнительные данные для ввода (например, в случае многострочных команд).PS3
— используется довольно редко. Отображается при работе встроенной команды Bashselect
, выводящей интерактивное меню. В отличие от остальных приглашений, не раскрывает 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: управление приглашением
Фундаментальные основы Linux. Часть III. Раскрытие команд командной оболочкой
Оригинал:
Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 13 декабря 2014 г.
Глава 12. Переменные командной оболочки
В данной главе мы познакомимся с методикой работы с переменными окружения
с использованием командной оболочки. Эти переменные
обычно требуются для работы приложений.
Символ доллара ($)
Еще одним важным интерпретируемым командной оболочкой символом является символ доллара $
. Командная оболочка будет искать переменную окружения
с именем, соответствующим размещенной после символа доллара
строке, и заменять данный символ и имя переменной на значение этой переменной (или ни на что в том случае, если переменной не существует).
Ниже приведено несколько примеров использования переменных $HOSTNAME, $USER, $UID, $SHELL и $HOME.
[paul@RHELv4u3 ~]$ echo Это командная оболочка $SHELL Это командная оболочка /bin/bash [paul@RHELv4u3 ~]$ echo Данная командная оболочка $SHELL используется на компьютере $HOSTNAME Данная командная оболочка /bin/bash используется на компьютере RHELv4u3.localdomain [paul@RHELv4u3 ~]$ echo Идентификатор пользователя $USER равен $UID Идентификатор пользователя paul равен 500 [paul@RHELv4u3 ~]$ echo Моей домашней директорией является директория $HOME Моей домашней директорией является директория /home/paul
Зависимость от регистра
В данном примере показано, что имена переменных командной оболочки зависят от регистра!
[paul@RHELv4u3 ~]$ echo Привет $USER Привет paul [paul@RHELv4u3 ~]$ echo Привет $user Привет
Создание переменных
В данном примере осуществляется создание переменной $MyVar
с последующей установкой ее значения. После этого в примере используется команда echo
для проверки значения созданной переменной.
[paul@RHELv4u3 gen]$ MyVar=555 [paul@RHELv4u3 gen]$ echo $MyVar 555 [paul@RHELv4u3 gen]$
Кавычки
Обратите внимание на то, что двойные кавычки также позволяют осуществлять раскрытие переменных в строке команды, в то время, как одинарные кавычки позволяют предотвратить такое раскрытие.
[paul@RHELv4u3 ~]$ MyVar=555 [paul@RHELv4u3 ~]$ echo $MyVar 555 [paul@RHELv4u3 ~]$ echo "$MyVar" 555 [paul@RHELv4u3 ~]$ echo '$MyVar' $MyVar
Командная оболочка bash будет заменять переменные на их значения в строках, помещенных в двойные кавычки, но не будет осуществлять такую замену в строках, помещенных в одинарные кавычки.
paul@laika:~$ city=Burtonville paul@laika:~$ echo "Сейчас мы находимся в городе $city." Сейчас мы находимся в городе Burtonville. paul@laika:~$ echo ' Сейчас мы находимся в городе $city.' Сейчас мы находимся в городе $city.
Команда set
Вы можете использовать команду set
для вывода списка переменных окружения. В системах Ubuntu и Debian команда set
также выведет список функций командной оболочки после списка переменных командной оболочки. Поэтому для ознакомления со всеми элементами списка переменных окружения при работе с данными системами рекомендуется использовать команду set | more
.
Команда unset
Следует использовать команду unset
для удаления переменной из вашего окружения командной оболочки.
[paul@RHEL4b ~]$ MyVar=8472 [paul@RHEL4b ~]$ echo $MyVar 8472 [paul@RHEL4b ~]$ unset MyVar [paul@RHEL4b ~]$ echo $MyVar [paul@RHEL4b ~]$
Переменная окружения $PS1
Переменная окружения $PS1
устанавливает формат приветствия вашей командной оболочки. При вводе строки форматирования вы можете использовать обратный слэш для экранирования таких специальных символов, как символ u
, предназначенный для вывода имени пользователя, или w
, предназначенный для вывода имени рабочей директории. На странице руководства командной оболочки bash
представлен полный список специальных символов.
В примере ниже мы несколько раз изменяем значение переменной окружения $PS1
.
paul@deb503:~$ PS1=приглашение приглашение приглашениеPS1='приглашение ' приглашение приглашение PS1='> ' > > PS1='u@h$ ' paul@deb503$ paul@deb503$ PS1='u@h:W$' paul@deb503:~$
Для того, чтобы избежать неисправимых ошибок, вы можете использовать зеленый цвет для приглашений командной оболочки, выводимых обычным пользователям, и красный цвет для приглашений командной оболочки, выводимых пользователю root. Добавьте следующие строки в ваш файл .bashrc
для использования зеленого цвета в приглашениях, выводимых обычным пользователям.
# цветное приглашение командной оболочки, созданное paul RED='[33[01;31m]' WHITE='[33[01;00m]' GREEN='[33[01;32m]' BLUE='[33[01;34m]' export PS1="${debian_chroot:+($debian_chroot)}$GREENu$WHITE@$BLUEh$WHITEw$ "
Переменная окружения $PATH
Переменная окружения $PATH
устанавливает директории файловой системы, в которых командная оболочка ищет бинарные файлы, необходимые для исполнения команд (за исключением тех случаев, когда команда является встроенной или представлена псевдонимом команды). Данная переменная содержит список путей к директориям с символами двоеточия в качестве разделителей.
[[paul@RHEL4b ~]$ echo $PATH /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:
Командная оболочка не будет осуществлять поиск бинарных файлов, которые могут быть исполнены, в текущей директории. (Функция поиска исполняемых файлов в текущей директории являлась простейшим механизмом несанкционированного доступа к данным, хранящимся на компьютерах под управлением PC-DOS). В том случае, если вы хотите, чтобы командная оболочка осуществляла поиск исполняемых файлов в текущей директории, вам следует добавить символ . в конец строки, являющейся значением переменной $PATH вашей командной оболочки.
[paul@RHEL4b ~]$ PATH=$PATH:. [paul@RHEL4b ~]$ echo $PATH /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:. [paul@RHEL4b ~]$
Значение переменной $PATH вашей командной оболочки может отличаться в случае использования команды su вместо команды su -
, так как последняя команда позволяет дополнительно использовать значения переменных окружения целевого пользователя. К примеру, в представленный значением переменной $PATH список директорий пользователя root обычно добавляются директории /sbin
.
[paul@RHEL3 ~]$ su Password: [root@RHEL3 paul]# echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin [root@RHEL3 paul]# exit [paul@RHEL3 ~]$ su - Password: [root@RHEL3 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin: [root@RHEL3 ~]#
Команда env
Команда env
в случае использования без параметров выведет список экспортированных переменных окружения
. Отличие данной команды от команды set
с параметрами заключается в том, что команда set
выводит список всех переменных окружения, включая те переменные, которые не экспортируются в дочерние командные оболочки.
Кроме того, команда env
может также использоваться для запуска «чистой» командной оболочки (командной оболочки без наследования какого-либо окружения). Команда env -i
позволяет очистить окружение дочерней командной оболочки.
При рассмотрении данного примера следует обратить внимание на то, что командная оболочка bash
установит значение переменной окружения $SHELL
при запуске.
[paul@RHEL4b ~]$ bash -c 'echo $SHELL $HOME $USER' /bin/bash /home/paul paul [paul@RHEL4b ~]$ env -i bash -c 'echo $SHELL $HOME $USER' /bin/bash [paul@RHEL4b ~]$
Вы можете использовать команду env
для установки значения переменной $LANG
или любой другой переменной окружения одного экземпляра командной оболочки bash
в рамках одной команды. В примере ниже данная возможность используется для демонстрации влияния значения переменной $LANG
на работу механизма поиска файлов по шаблонам (для получения дополнительной информации о данном механизме следует обратиться к главе, посвященной поиску файлов по шаблонам).
[paul@RHEL4b test]$ env LANG=C bash -c 'ls File[a-z]' Filea Fileb [paul@RHEL4b test]$ env LANG=en_US.UTF-8 bash -c 'ls File[a-z]' Filea FileA Fileb FileB [paul@RHEL4b test]$
Команда export
Вы можете экспортировать переменные командной оболочки в другие командные оболочки с помощью команды export
. В примере ниже с помощью данной команды осуществляется экспорт переменной окружения в дочерние командные оболочки.
[paul@RHEL4b ~]$ var3=три [paul@RHEL4b ~]$ var4=четыре [paul@RHEL4b ~]$ export var4 [paul@RHEL4b ~]$ echo $var3 $var4 три четыре [paul@RHEL4b ~]$ bash [paul@RHEL4b ~]$ echo $var3 $var4 четыре
При этом с помощью данной команды переменная не экспортируется в родительскую командную оболочку (ниже приведено продолжение предыдущего примера).
[paul@RHEL4b ~]$ export var5=пять [paul@RHEL4b ~]$ echo $var3 $var4 $var5 четыре пять [paul@RHEL4b ~]$ exit exit [paul@RHEL4b ~]$ echo $var3 $var4 $var5 три четыре [paul@RHEL4b ~]$
Разграничения переменных
До текущего момента мы сталкивались с тем, что командная оболочка bash интерпретирует переменную начиная с символа доллара, продолжая интерпретацию до появления первого не алфавитно-цифрового символа, который не является символом подчеркивания. В некоторых ситуациях такое поведение может оказаться проблемой. Для решения этой проблемы могут использоваться фигурные скобки таким образом, как показано в примере ниже.
[paul@RHEL4b ~]$ prefix=Super [paul@RHEL4b ~]$ echo Привет $prefixman и $prefixgirl Привет и [paul@RHEL4b ~]$ echo Привет ${prefix}man и ${prefix}girl Привет Superman и Supergirl [paul@RHEL4b ~]$
Несвязанные переменные
В примере ниже представлена попытка вывода значения переменной $MyVar
, но она не является успешной ввиду того, что переменной не существует. По умолчанию командная оболочка не будет выводить ничего в том случае, если переменная не связана (ее не существует).
[paul@RHELv4u3 gen]$ echo $MyVar [paul@RHELv4u3 gen]$
Однако, существует параметр командной оболочки nounset
, который вы можете использовать для генерации ошибки в том случае, если используемой переменной не существует.
paul@laika:~$ set -u paul@laika:~$ echo $Myvar bash: Myvar: unbound variable paul@laika:~$ set +u paul@laika:~$ echo $Myvar paul@laika:~$
В командной оболочке bash команда set -u
идентична команде set -o nounset
и, по аналогии, команда set +u
идентична команде set +o nounset
.
Практическое задание: переменные командной оболочки
-
1. Используйте команду echo для вывода строки «Привет», после которой должно следовать ваше имя. (Используйте переменную командной оболочки bash!)
-
2. Создайте переменную
answer
, значение которой равно 42. -
3. Скопируйте значение переменной $LANG в значение переменной $MyLANG.
-
4. Выведите список используемых в данное время переменных командной оболочки.
-
5. Выведите список всех экспортируемых переменных командной оболочки.
-
6. Присутствует ли информация о вашей переменной в выводе команд
env
иset
? -
7. Уничтожьте вашу переменную
answer
. -
8. Создайте две переменные и
экспортируйте
одну из них. -
9. Выведите значение экспортированной переменной в дочерней интерактивной командной оболочке.
-
10. Создайте переменную и присвойте ей значение ‘Dumb’, после чего аналогичным образом создайте другую переменную с значением ‘do’. Используйте команду
echo
и две созданные переменные для вывода слова ‘Dumbledore’. -
11. Найдите список экранированных с помощью обратного слэша управляющих символов на странице руководства командной оболочки bash. Добавьте управляющий символ в значение переменной
PS1
для вывода времени в приветствии командной оболочки.
Корректная процедура выполнения практического задания: переменные командной оболочки
-
1. Используйте команду echo для вывода строки «Привет», после которой должно следовать ваше имя. (Используйте переменную командной оболочки bash!)
-
2. Создайте переменную
answer
, значение которой равно 42. -
3. Скопируйте значение переменной $LANG в значение переменной $MyLANG.
-
4. Выведите список используемых в данное время переменных командной оболочки.
-
set set|more в Ubuntu/Debian
-
5. Выведите список всех экспортируемых переменных командной оболочки.
-
6. Присутствует ли информация о вашей переменной в выводе команд
env
иset
? -
7. Уничтожьте вашу переменную
answer
. -
8. Создайте две переменные и
экспортируйте
одну из них. -
9. Выведите значение экспортированной переменной в дочерней интерактивной командной оболочке.
-
10. Создайте переменную и присвойте ей значение ‘Dumb’, после чего аналогичным образом создайте другую переменную с значением ‘do’. Используйте команду
echo
и две созданные переменные для вывода слова ‘Dumbledore’. -
varx=Dumb; vary=do Решение от Yves из компании Dexia : echo $varx'le'$vary're' Решение от Erwin из компании Telenet : echo "$varx"le"$vary"re
-
11. Найдите список экранированных с помощью обратного слэша управляющих символов на странице руководства командной оболочки bash. Добавьте управляющий символ в значение переменной
PS1
для вывода времени в приветствии командной оболочки.
Если вам понравилась статья, поделитесь ею с друзьями:
Для временных изменений (с помощью команды export PS1 = ””) вы можете сбросить настройки по умолчанию, выйдя из системы. Если вы редактировали файл. bashrc для внесения постоянных изменений, есть два метода для возврата к настройкам по умолчанию: отображать ваши изменения как комментарии, редактируя файл и добавляя # перед каждым внесенным вами изменением.
PS1 — это первичная переменная подсказки, которая содержит u@h W$ специальных символов bash. Это структура приглашения bash по умолчанию, которая отображается каждый раз, когда пользователь входит в систему с помощью терминала. Эти значения по умолчанию устанавливаются в / etc / bashrc файл.
Как изменить консоль по умолчанию в Linux?
Пользовательские настройки по умолчанию
- Откройте nautilus или nemo от имени пользователя root gksudo nautilus.
- Перейдите в / usr / bin.
- Измените имя вашего терминала по умолчанию на любое другое имя, например «orig_gnome-terminal»
- переименуйте свой любимый терминал как «gnome-terminal»
Как изменить оболочку в Linux?
Чтобы изменить приглашение Bash, вам просто нужно добавить, удалить или переставить специальные символы в переменной PS1. Но вы можете использовать гораздо больше переменных, чем те, которые используются по умолчанию. Оставьте пока текстовый редактор — в nano, нажмите Ctrl + X, чтобы выйти.
Как сделать настройку подсказки постоянной?
Внесите постоянные изменения в подсказку
Сохранить файл нажав Ctrl + X, а затем нажав Y. Теперь изменения в приглашении bash будут постоянными.
Как вы показываете, какие предыдущие команды были введены?
Команда просто называется история, но к нему также можно получить доступ, посмотрев на ваш. bash_history в вашей домашней папке. По умолчанию команда history покажет вам последние пятьсот введенных вами команд.
Как мне сменить пользователя в Linux?
Чтобы перейти к другому пользователю и создать сеанс, как если бы другой пользователь вошел в систему из командной строки, введите «su -», затем пробел и имя пользователя целевого пользователя.. При появлении запроса введите пароль целевого пользователя.
Как мне найти оболочку по умолчанию в Linux?
readlink / proc / $$ / exe — еще один вариант надежного получения текущего имени оболочки в операционных системах Linux. cat / etc / shells — Список путей к действующим установленным оболочкам входа в систему. grep «^ $ USER» / etc / passwd — Вывести имя оболочки по умолчанию. Оболочка по умолчанию запускается, когда вы открываете окно терминала.
Как мне перейти на bash?
Из системных настроек
Удерживая клавишу Ctrl, щелкните имя своей учетной записи на левой панели и выберите «Дополнительные параметры». Щелкните раскрывающееся окно «Оболочка входа» и выберите «/ Bin / bash» для использования Bash в качестве оболочки по умолчанию или «/ bin / zsh» для использования Zsh в качестве оболочки по умолчанию. Нажмите «ОК», чтобы сохранить изменения.
Что такое команда оболочки в Linux?
Оболочка интерпретатор командной строки Linux. Он обеспечивает интерфейс между пользователем и ядром и выполняет программы, называемые командами. Например, если пользователь вводит ls, оболочка выполняет команду ls.
Как открыть оболочку в Linux?
Вы можете открыть приглашение оболочки, выбрав Приложения (главное меню на панели). => Системные инструменты => Терминал. Вы также можете запустить приглашение оболочки, щелкнув правой кнопкой мыши на рабочем столе и выбрав в меню «Открыть терминал».
Как в Linux перейти с root на нормальный?
Вы можете переключиться на другого обычного пользователя, используя команду su. Пример: su John Затем введите пароль для Джона, и вы переключитесь на пользователя «Джон» в терминале.