Как изменить ps1

Простое описание по изменению приглашения в командной строке 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

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

Чтобы изменить 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 — используется довольно редко. Отображается при работе встроенной команды 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: управление приглашением

Фундаментальные основы 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?

Пользовательские настройки по умолчанию

  1. Откройте nautilus или nemo от имени пользователя root gksudo nautilus.
  2. Перейдите в / usr / bin.
  3. Измените имя вашего терминала по умолчанию на любое другое имя, например «orig_gnome-terminal»
  4. переименуйте свой любимый терминал как «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 Затем введите пароль для Джона, и вы переключитесь на пользователя «Джон» в терминале.

Понравилась статья? Поделить с друзьями:
  • Как изменить prt sc
  • Как изменить proxy сервер
  • Как изменить props vue
  • Как изменить props react
  • Как изменить shell windows