Введение / Зачем это нужно
Приглашение командной строки (bash prompt) — это строка, которую вы видите перед курсором в терминале. По умолчанию оно обычно выглядит как user@host:~/path$. Кастомизация prompt делает работу в терминале более информативной и визуально приятной. Вы можете добавить отображение текущего времени, статуса последней команды, ветки Git, а также использовать цвета для выделения важной информации. После выполнения этого гайда вы получите prompt, который будет подстраиваться под ваши задачи и предпочтения.
Требования / Подготовка
- У вас должен быть установлен bash (версии 4.0 и выше). Проверить версию:
bash --version. - Убедитесь, что у вас есть доступ к домашней директории и возможность редактировать файл
~/.bashrc. - Рекомендуется использовать терминал, поддерживающий 256 цветов (например, GNOME Terminal, Konsole, iTerm2). Проверить:
echo $TERM(должно бытьxterm-256colorилиscreen-256color). - Базовые знания о редактировании текстовых файлов в 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 (если установлен).
Проверка результата
- После внесения изменений в
~/.bashrcвыполнитеsource ~/.bashrcили закройте и откройте терминал заново. - Убедитесь, что prompt отображается с цветами и информацией.
- Проверьте сценарии:
- Перейдите в директорию с Git-репозиторием — должна отобразиться ветка.
- Выполните команду, которая завершится с ошибкой (например,
ls non_existent_file). В следующем prompt должен появиться код ошибки. - Проверьте, что цвета не "разбегаются" (после сброса
\[\e[m\]следующий текст должен быть стандартного цвета).
- Если что-то не работает, проверьте синтаксис в
~/.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 позже в том же файле (порядок важен).