Как изменить цвет вывода echo в терминале Linux
Как вывести цветной текст командой echo в Linux: ANSI коды цвета, примеры с echo -e, printf, таблица цветов. Советы по совместимости и отладке для терминала Bash, zsh.
Как изменить цвет вывода команды echo в Linux
Я пытаюсь вывести текст красным цветом в терминале с помощью команды echo. Как это можно сделать?
Цвет текста в терминале Linux меняют с помощью ANSI‑escape‑последовательностей (ANSI коды цвета): например echo -e "\033[31mКрасный текст\033[0m" выведет строку красным. Для скриптов надёжнее использовать printf или bash‑синтаксис $'…': printf '\033[31m%s\033[0m\n' "Красный". Код 31 — красный для foreground, \033[0m сбрасывает форматирование.
Содержание
- Короткий пример
- Как работают ANSI коды цвета
- Примеры: echo и printf (красный текст)
- Список цветов и соответствующие коды
- Практические советы и совместимость
- Частые ошибки и отладка
- Источники
- Заключение
Как изменить цвет текста в терминале — короткий пример
Самый простой способ вывести красный текст в терминал — вставить ANSI‑escape последовательность перед текстом и сбросить цвет в конце. Примеры работают в большинстве терминалов (xterm, GNOME Terminal, Konsole и т.д.):
# вариант с echo (bash/zsh, может потребоваться -e)
echo -e "\033[31mЭто красный текст\033[0m"
# bash-специфичный вариант с $'...'
echo $'\e[31mЭто красный текст\e[0m'
# более переносимый вариант — printf
printf '\033[31m%s\033[0m\n' "Это красный текст"
Коротко: \033 (или \e) — это ESC, 31m — код красного цвета для foreground, а \033[0m — сброс всех атрибутов. Более подробные примеры и объяснения есть в статьях и справочниках по ANSI‑кодам цвета на Habr и в руководствах по Bash (см. ссылки внизу).
Как работают ANSI коды цвета
Формат команды: ESC [ параметры m. ESC — это символ с кодом 27, который в текстах часто пишут как \033, \e или \x1b. Параметры разделяются точкой с запятой и задают атрибуты, цвет текста и цвет фона. Пример комбинирования: \033[1;31;43m — полужирный красный текст на жёлтом фоне.
Общие параметры:
0— сброс (reset).1— жирный (bold).4— подчеркивание (underline).30–37— основные цвета foreground.40–47— основные цвета background.90–97— яркие (high intensity) foreground.100–107— яркие background.
Таблицы и примеры форматов подробно описаны в справочниках по ANSI‑кодам; полезная сводка есть на Wikilinux и в статьях на linux-console.
Примеры: echo и printf (красный текст)
Разные способы, с пояснениями:
- echo с интерпретацией escape-последовательностей (не всегда переносимо):
echo -e "\033[31mОшибка:\033[0m файл не найден"
- bash‑подход с
$'…'(удобно в интерактивной оболочке):
echo $'\e[31mОшибка:\e[0m файл не найден'
- printf — надёжнее для скриптов:
printf '\033[0;31m%s\033[0m\n' "Ошибка: файл не найден"
- Использование переменных для читаемости:
RED='\033[0;31m'
RESET='\033[0m'
printf "%b\n" "${RED}Ошибка:${RESET} файл не найден"
Функция для логов:
log_error() { printf '\033[0;31mERROR:\033[0m %s\n' "$1"; }
log_error "Непредвиденная ошибка"
Если нужна документация и примеры — посмотрите статью на IT is good и практические примеры на mb4.ru.
Список цветов и соответствующие коды
Ниже — быстрый справочник по основным кодам.
| Цвет (foreground) | Код FG | Код BG (background) |
|---|---|---|
| Чёрный | 30 | 40 |
| Красный | 31 | 41 |
| Зелёный | 32 | 42 |
| Жёлтый | 33 | 43 |
| Синий | 34 | 44 |
| Пурпурный (фиолетовый) | 35 | 45 |
| Голубой (cyan) | 36 | 46 |
| Белый (серый) | 37 | 47 |
| Яркий чёрный (тёмно‑серый) | 90 | 100 |
| Ярко‑красный | 91 | 101 |
| Ярко‑зелёный | 92 | 102 |
| Ярко‑жёлтый | 93 | 103 |
| Ярко‑синий | 94 | 104 |
| Ярко‑пурпурный | 95 | 105 |
| Ярко‑голубой | 96 | 106 |
| Ярко‑белый | 97 | 107 |
Примеры комбинаций:
\033[31m— красный текст.\033[41m— красный фон.\033[1;31m— жирный красный текст.\033[31;43m— красный текст на жёлтом фоне.
Подробную таблицу и примеры можно найти на Habr и в руководствах по Bash.
Практические советы и совместимость
- echo vs printf:
echo -eработает в bash и zsh, но не гарантированно вsh/dash— для скриптов лучшеprintf. См. примеры в статье на Habr. - Проверка, что вывод идёт в терминал: если скрипт может быть запущен с перенаправлением, отключайте цвета, когда stdout не tty:
if [ -t 1 ]; then RED='\033[0;31m'; RESET='\033[0m'; else RED=''; RESET=''; fi
printf "%b\n" "${RED}Сообщение${RESET}"
- Просмотр цветного вывода в
less: используйтеless -R, чтобы увидеть управляющие последовательности как цвет. - Терминал поддерживает разные режимы: 8/16 цветов, 256 цветов и truecolor. Для 256‑цветов используют
\x1b[38;5;Nm(foreground) и для 24‑бит RGB —\x1b[38;2;R;G;Bm(это более продвинутые варианты; поддержка зависит от терминала). - Для переносимости можно применять
tput(терминфо) — он скрывает детали терминала:color=$(tput setaf 1); reset=$(tput sgr0); printf '%s%s%s\n' "$color" "Текст" "$reset".
Частые ошибки и отладка
- Коды печатаются как обычный текст (видите
\033[31mв выводе)? Значит, escape-последовательности не интерпретируются. Решение: используйтеprintf,$'...'илиecho -eв оболочке, где он поддерживается. - Цвет не возвращается к норме? Не забывайте добавить
\033[0mв конце. - Скрипт запускается под
shиecho -eне работает — используйтеprintf. - Цвета исчезают при перенаправлении в файл — это нормально, escape‑последовательности попадают в файл. Для записи без кодов уберите ANSI‑последовательности или отключите их в скрипте, если
stdoutне tty. - Не видите цвет в
less? Запускайтеless -Rили экспортируйтеLESS=-R.
Если нужно пошагово проверить, как оболочка трактует аргументы, попробуйтеprintf '%s\n' "$VAR"и экспериментируйте с%b/%s.
Источники
- Цветной вывод текста командой echo в Bash — mb4.ru
- Как изменить цвет текста в терминале Linux — Habr
- Изменение цвета вывода команды echo – IT is good
- Как изменить цвет вывода эха в Bash — Linux Console
- Bash. Часть 5. Управление цветом — Wikilinux
Заключение
Для управления цветом текста в терминале используйте ANSI‑escape‑последовательности — это стандартный способ для цвета текста в терминале Linux. Быстрый вариант: echo -e "\033[31mТекст\033[0m", но для надёжности и переносимости в скриптах лучше применять printf или bash‑синтаксис $'…'. Запомните: 31 — красный, \033[0m — сброс; всегда проверяйте поддержку терминала и отключайте цвета при перенаправлении вывода.