Linux

Кастомизация bash prompt: настройка PS1, цветов и информации

В этом гайде вы узнаете, как полностью кастомизировать приглашение bash (prompt) с помощью переменной PS1. Мы рассмотрим настройку цветов, отображение системной информации и условные конструкции.

Обновлено 16 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Bash 4.0+Ubuntu 20.04+Fedora 35+Arch Linux

Введение / Зачем это нужно

Приглашение командной строки (bash prompt) — это строка, которую вы видите перед курсором в терминале. По умолчанию оно обычно выглядит как user@host:~/path$. Кастомизация prompt делает работу в терминале более информативной и визуально приятной. Вы можете добавить отображение текущего времени, статуса последней команды, ветки Git, а также использовать цвета для выделения важной информации. После выполнения этого гайда вы получите prompt, который будет подстраиваться под ваши задачи и предпочтения.

Требования / Подготовка

  1. У вас должен быть установлен bash (версии 4.0 и выше). Проверить версию: bash --version.
  2. Убедитесь, что у вас есть доступ к домашней директории и возможность редактировать файл ~/.bashrc.
  3. Рекомендуется использовать терминал, поддерживающий 256 цветов (например, GNOME Terminal, Konsole, iTerm2). Проверить: echo $TERM (должно быть xterm-256color или screen-256color).
  4. Базовые знания о редактировании текстовых файлов в Linux (nano, vim, etc.).

Шаг 1: Найдите и откройте конфигурационный файл bash

Бash читает конфигурационные файлы при запуске. Для интерактивных оболочек это обычно ~/.bashrc (для пользователя) или /etc/bash.bashrc (системный). Мы будем редактировать пользовательский файл, чтобы изменения не затрагивали других пользователей.

Откройте терминал и выполните:

nano ~/.bashrc

Или используйте предпочитаемый редактор (vim, code, gedit). Если файл пустой или отсутствует, создайте его.

Шаг 2: Поймите структуру переменной PS1

Переменная PS1 определяет основной prompt. Она поддерживает множество escape-последовательностей, которые заменяются на актуальные данные. Вот основные:

Escape-последовательностьОписание
\uИмя текущего пользователя
\hИмя хоста (до первой точки)
\HПолное имя хоста
\wПолный путь текущей директории, с ~ для домашней
\WТолько имя текущей директории
\$# для root, $ для обычного пользователя
\tТекущее время в 24-часовом формате (HH:MM:SS)
\TВремя в 12-часовом формате (HH:MM:SS)
\@Время в 12-часовом формате с AM/PM
\dДата в формате "День ММ ГГГГ"
\nНовая строка
\[ и \]Обозначают начало и конец непечатаемых символов (например, для цветов)

Важно: Для цветов используются escape-последовательности ANSI, которые нужно заключать в \[ и \], чтобы bash правильно считал длину prompt.

Шаг 3: Добавьте простые цвета и информацию

Давайте создадим простой цветной prompt, который показывает пользователя, хост и текущую директорию.

Добавьте в ~/.bashrc строку:

PS1='\[\e[0;32m\]\u@\h:\w\$ \[\e[m\] '

Разберем:

  • \[\e[0;32m\] — включает зеленый цвет (код 32). \e — escape-символ, [0;32m — код цвета.
  • \u@\h:\w\$ — комбинация escape-последовательностей: пользователь, символ @, хост, двоеточие, текущий путь, $ или #.
  • \[\e[m\] — сброс цветов к стандартным.
  • Пробел в конце для удобства.

После сохранения файла выполните source ~/.bashrc или откройте новый терминал. Вы должны увидеть зеленый prompt.

Шаг 4: Используйте более сложные цвета и форматирование

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

PS1='\[\e[1;32m\]\u@\h\[\e[m\]:\[\e[1;34m\]\w\[\e[m\]\$ '

Здесь:

  • \[\e[1;32m\] — жирный зеленый (1 — жирный, 32 — зеленый).
  • \[\e[m\] — сброс после имени пользователя и хоста.
  • \[\e[1;34m\] — жирный синий для пути.

Список цветов (перед кодом можно добавить 1; для жирного):

  • Черный: 30
  • Красный: 31
  • Зеленый: 32
  • Желтый: 33
  • Синий: 34
  • Пурпурный: 35
  • Голубой: 36
  • Белый: 37

Также можно использовать 256-цветовую палитру: \[\e[38;5;{номер}м\] (например, \[\e[38;5;202m\] для оранжевого). Номер цвета от 0 до 255.

Шаг 5: Добавьте динамическую информацию (время, статус, Git)

Время

Чтобы добавить текущее время, используйте \t или \@:

PS1='\[\e[0;33m\]\t \[\e[m\]\u@\h:\w\$ '

Статус последней команды

Escape-последовательность \$? возвращает код выхода последней команды (0 — успех, не 0 — ошибка). Но в PS1 она не работает напрямую. Нужно использовать команду-подстановку или условную конструкцию. Пример с отображением ! при ошибке:

PS1='\[\e[0;31m\]$(if [[ $? != 0 ]]; then echo "! "; fi)\[\e[m\]\u@\h:\w\$ '

Однако это может замедлять prompt, так как выполняется для каждого вызова. Более эффективный способ — использовать PROMPT_COMMAND:

PROMPT_COMMAND='RET=$?; [[ $RET != 0 ]] && echo -n "!$RET "'
PS1='\[\e[0;33m\]\u@\h:\w\$ \[\e[m\]'

Информация о Git

Если вы работаете с Git, полезно отображать текущую ветку. Добавьте функцию в ~/.bashrc:

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

Затем используйте в PS1:

PS1='\[\e[0;36m\]\u@\h\[\e[m\]:\[\e[1;34m\]\w\[\e[0;33m\]$(parse_git_branch)\[\e[m\]\$ '

Эта функция будет показывать ветку в скобках, если текущая директория — репозиторий Git.

Шаг 6: Оптимизируйте и комбинируйте

Теперь объединим всё: цвета, время, Git, статус. Пример продвинутого prompt:

# Функция для Git
parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

# PROMPT_COMMAND для статуса
PROMPT_COMMAND='RET=$?; [[ $RET != 0 ]] && echo -ne "\e[0;31m!$RET \e[m"'

# Сам PS1
PS1='\[\e[0;33m\]\t \[\e[m\]\u@\h:\[\e[1;34m\]\w\[\e[0;32m\]$(parse_git_branch)\[\e[m\]\$ '

Этот prompt:

  • Показывает время (желтый).
  • Имя пользователя и хост (стандартный цвет).
  • Текущий путь (жирный синий).
  • Ветку Git (зеленый).
  • При ошибке предыдущей команды выводит !код красным.

Совет: Если prompt становится слишком длинным или медленным (например, из-за частых вызовов git), упростите его. Для Git можно использовать более быстрые альтернативы, например, __git_ps1 из пакета git (если установлен).

Проверка результата

  1. После внесения изменений в ~/.bashrc выполните source ~/.bashrc или закройте и откройте терминал заново.
  2. Убедитесь, что prompt отображается с цветами и информацией.
  3. Проверьте сценарии:
    • Перейдите в директорию с Git-репозиторием — должна отобразиться ветка.
    • Выполните команду, которая завершится с ошибкой (например, ls non_existent_file). В следующем prompt должен появиться код ошибки.
    • Проверьте, что цвета не "разбегаются" (после сброса \[\e[m\] следующий текст должен быть стандартного цвета).
  4. Если что-то не работает, проверьте синтаксис в ~/.bashrc (лишние кавычки, отсутствие \[/\] для цветов).

Возможные проблемы

Проблема 1: Цвета не отображаются или "разбегаются"

Причина: Неправильное использование \[ и \] вокруг непечатаемых символов (escape-последовательностей). Bash использует эти маркеры для корректного расчета длины prompt. Если их нет, курсор может смещаться.

Решение: Убедитесь, что каждый блок цвета (включая сброс) обернут в \[ и \]. Пример правильного: \[\e[0;32m\]...\[\e[m\].

Проблема 2: Prompt слишком медленный

Причина: Выполнение тяжелых команд (например, git status или parse_git_branch без кэширования) при каждом выводе prompt.

Решение:

  • Упростите функцию Git, используя __git_ps1 (если установлен пакет git). Он оптимизирован.
  • Или добавьте кэширование: например, обновлять информацию о Git только при изменении директории (через PROMPT_COMMAND и проверку $PWD).
  • Удалите ненужные данные из PS1.

Проблема 3: Unicode-символы или эмодзи отображаются некорректно

Причина: Терминал или шрифт не поддерживают эти символы, или локаль не в UTF-8.

Решение:

  • Установите шрифт с поддержкой эмодзи (например, Nerd Fonts).
  • Проверьте локаль: locale должен содержать UTF-8. При необходимости: export LANG=en_US.UTF-8 в ~/.bashrc.
  • Убедитесь, что терминал настроен на UTF-8.

Проблема 4: Изменения не применяются после source ~/.bashrc

Причина: Синтаксическая ошибка в ~/.bashrc (например, незакрытая кавычка). Bash может не загружать файл при ошибке.

Решение: Проверьте файл на синтаксис, выполнив bash -n ~/.bashrc. Исправьте ошибки. Также убедитесь, что вы не перезаписываете PS1 позже в том же файле (порядок важен).

Часто задаваемые вопросы

Как вернуть стандартный prompt в bash?
Почему цвета в bash prompt не работают?
Как добавить текущую директорию в prompt?
Можно ли использовать Unicode символы в bash prompt?

Полезное

Откройте файл ~/.bashrc
Найдите переменную PS1
Измените PS1 под свои нужды
Примените изменения