Печать в терминале с цветами?
Как вывести цветной текст на терминал в Python? Какой символ Unicode лучше всего представляет сплошной блок?
65 ответов
Это зависит от того, на какой платформе вы находитесь. Наиболее распространенный способ сделать это - распечатать escape-последовательности ANSI. Для простого примера, вот код Python из скриптов сборки blender:
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
Чтобы использовать такой код, вы можете сделать что-то вроде
print bcolors.WARNING + "Warning: No active frommets remain. Continue?"
+ bcolors.ENDC
Это будет работать на Unix, включая OS X, Linux и Windows (при условии, что вы используете ANSICON, или в Windows 10, если вы включаете эмуляцию VT100). Есть ANSI коды для установки цвета, перемещения курсора и многое другое.
Если вы собираетесь усложниться с этим (и если вы пишете игру, это звучит так, как если бы вы писали игру), вам следует заглянуть в модуль "curses", который обрабатывает многие сложные части этого для вас. Python Curses HowTO - хорошее введение.
Если вы не используете расширенный ASCII (то есть не на ПК), вы застряли с символами ascii ниже 127, и "#" или "@", вероятно, - лучшая ставка для блока. Если вы можете быть уверены, что ваш терминал использует расширенный набор символов IBM ascii, у вас есть еще много вариантов. Символы 176, 177, 178 и 219 являются "блочными персонажами".
Некоторые современные текстовые программы, такие как "Dwarf Fortress", эмулируют текстовый режим в графическом режиме и используют изображения классического шрифта для ПК. Вы можете найти некоторые из этих растровых изображений, которые вы можете использовать на вики Dwarf Fortress Wiki ( пользовательские наборы плиток).
В демонстрационном конкурсе в текстовом режиме есть больше ресурсов для создания графики в текстовом режиме.
Хм.. Я думаю, что немного увлекся этим ответом. Хотя я планирую эпическую текстовую приключенческую игру. Удачи с вашим цветным текстом!
Я удивлен, что никто не упомянул модуль Python termcolor. Использование довольно просто:
from termcolor import colored
print colored('hello', 'red'), colored('world', 'green')
Или в Python 3:
print(colored('hello', 'red'), colored('world', 'green'))
Однако он может быть недостаточно сложным для программирования игр и "цветных блоков", которые вы хотите сделать...
Ответ - Colorama для всех кроссплатформенных раскрасок в Python.
Напечатайте строку, которая начинает цвет / стиль, затем строку, а затем завершите изменение цвета / стиля с помощью '\x1b[0m'
:
print('\x1b[6;30;42m' + 'Success!' + '\x1b[0m')
Получите таблицу параметров формата для текста оболочки со следующим кодом:
def print_format_table():
"""
prints table of formatted text format options
"""
for style in range(8):
for fg in range(30,38):
s1 = ''
for bg in range(40,48):
format = ';'.join([str(style), str(fg), str(bg)])
s1 += '\x1b[%sm %s \x1b[0m' % (format, format)
print(s1)
print('\n')
print_format_table()
Пример "свет в темноте" (завершено)
Пример темного света (частичный)
Определите строку, начинающую цвет, и строку, оканчивающую цвет, затем напечатайте текст с начальной строкой впереди и конечной строкой в конце.
CRED = '\033[91m'
CEND = '\033[0m'
print(CRED + "Error, does not compute!" + CEND)
Это производит следующее в bash
, в urxvt
с цветовой схемой в стиле Zenburn:
Благодаря экспертизе мы можем получить больше цветов:
Замечания: \33[5m
а также \33[6m
мигают.
Таким образом, мы можем создать полноцветную коллекцию:
CEND = '\33[0m'
CBOLD = '\33[1m'
CITALIC = '\33[3m'
CURL = '\33[4m'
CBLINK = '\33[5m'
CBLINK2 = '\33[6m'
CSELECTED = '\33[7m'
CBLACK = '\33[30m'
CRED = '\33[31m'
CGREEN = '\33[32m'
CYELLOW = '\33[33m'
CBLUE = '\33[34m'
CVIOLET = '\33[35m'
CBEIGE = '\33[36m'
CWHITE = '\33[37m'
CBLACKBG = '\33[40m'
CREDBG = '\33[41m'
CGREENBG = '\33[42m'
CYELLOWBG = '\33[43m'
CBLUEBG = '\33[44m'
CVIOLETBG = '\33[45m'
CBEIGEBG = '\33[46m'
CWHITEBG = '\33[47m'
CGREY = '\33[90m'
CRED2 = '\33[91m'
CGREEN2 = '\33[92m'
CYELLOW2 = '\33[93m'
CBLUE2 = '\33[94m'
CVIOLET2 = '\33[95m'
CBEIGE2 = '\33[96m'
CWHITE2 = '\33[97m'
CGREYBG = '\33[100m'
CREDBG2 = '\33[101m'
CGREENBG2 = '\33[102m'
CYELLOWBG2 = '\33[103m'
CBLUEBG2 = '\33[104m'
CVIOLETBG2 = '\33[105m'
CBEIGEBG2 = '\33[106m'
CWHITEBG2 = '\33[107m'
Вот код для генерации теста:
x = 0
for i in range(24):
colors = ""
for j in range(5):
code = str(x+j)
colors = colors + "\33[" + code + "m\\33[" + code + "m\033[0m "
print(colors)
x=x+5
Я отвечаю, потому что я нашел способ использовать коды ANSI на окнах, чтобы вы могли изменить цвет текста без каких-либо модулей:
Линия, которая делает эту работу os.system('color')
, но чтобы убедиться, что вы не вызываете ошибок, если человек не в Windows, вы можете использовать этот скрипт:
import os, sys
if sys.platfrom.lower() == "win32":
os.system('color')
print ('\033[1;33mHello \033[0;0mworld')
Версия Python: 3.6.7 (32 бит)
Вы хотите узнать о escape-последовательностях ANSI. Вот краткий пример:
CSI="\x1B["
print CSI+"31;40m" + "Colored Text" + CSI + "0m"
Для получения дополнительной информации см. http://en.wikipedia.org/wiki/ANSI_escape_code
Для символа блока попробуйте использовать символ Юникода, например \u2588:
print u"\u2588"
Собираем все вместе:
print CSI+"31;40m" + u"\u2588" + CSI + "0m"
sty похож на colorama, но он менее подробный, поддерживает 8-битные и 24- битные (rgb) цвета, позволяет вам регистрировать собственные цвета, действительно гибкий и хорошо документированный. Если вам не нужна совместимость с эмуляторами терминалов, которые застряли в 90-х годах и хотели бы использовать новые функции, вы можете попробовать.
from sty import fg, bg, ef, rs, Rule
foo = fg.red + 'This is red text!' + fg.rs
bar = bg.blue + 'This has a blue background!' + bg.rs
baz = ef.italic + 'This is italic text' + rs.italic
qux = fg(201) + 'This is pink text using 8bit colors' + fg.rs
qui = fg(255, 10, 10) + 'This is red text using 24bit colors.' + fg.rs
# Add new colors:
fg.orange = Rule('rgb_fg', 255, 150, 50)
buf = fg.orange + 'Yay, Im orange.' + fg.rs
print(foo, bar, baz, qux, qui, buf, sep='\n')
печатает:
Rich - относительно новая библиотека Python для работы с цветом в терминале.
В Rich есть несколько способов работы с цветом. Самый быстрый способ начать - это использовать расширенный метод печати, который отображает синтаксис, подобный bbcode, в управляющие коды ANSI:
from rich import print
print("[red]Color[/] in the [bold magenta]Terminal[/]!")
Есть и другие способы применения цвета с помощью Rich (регулярное выражение, синтаксис) и связанных функций форматирования.
На мой взгляд, это самый простой способ. Пока у вас есть значения rgb желаемого цвета, это должно работать:
def colored(r, g, b, text):
return "\033[38;2;{};{};{}m{} \033[38;2;255;255;255m".format(r, g, b, text)
Пример печати красного текста:
text = 'Hello, World'
colored_text = colored(255, 0, 0, text)
print(colored_text)
#or
print(colored(255, 0, 0, 'Hello, World'))
Разноцветный текст
text = colored(255, 0, 0, 'Hello, ') + colored(0, 255, 0, 'World')
print(text)
Надеюсь это поможет
Мой любимый путь - с библиотекой Благословений (полное раскрытие: я написал это). Например:
from blessings import Terminal
t = Terminal()
print t.red('This is red.')
print t.bold_bright_red_on_black('Bright red on black')
Чтобы печатать цветные кубики, самый надежный способ - печатать пространства с фоновыми цветами. Я использую эту технику, чтобы нарисовать индикатор прогресса в прогрессивном виде:
print t.on_green(' ')
Вы также можете распечатать в определенных местах:
with t.location(0, 5):
print t.on_yellow(' ')
Если вам придется использовать другие возможности терминала в ходе игры, вы также можете это сделать. Вы можете использовать стандартное форматирование строки Python, чтобы сделать его читаемым:
print '{t.clear_eol}You just cleared a {t.bold}whole{t.normal} line!'.format(t=t)
Хорошая особенность Blessings заключается в том, что он делает все возможное для работы со всеми типами терминалов, а не только с (в подавляющем большинстве распространенными) ANSI-цветами. Он также сохраняет нечитаемые escape-последовательности в вашем коде, оставаясь при этом лаконичным в использовании. Повеселись!
Сгенерировал класс со всеми цветами, используя цикл for для итерации каждой комбинации цветов до 100, затем написал класс с цветами python. Скопируйте и вставьте, как вы, GPLv2 мной:
class colors:
'''Colors class:
reset all colors with colors.reset
two subclasses fg for foreground and bg for background.
use as colors.subclass.colorname.
i.e. colors.fg.red or colors.bg.green
also, the generic bold, disable, underline, reverse, strikethrough,
and invisible work with the main class
i.e. colors.bold
'''
reset='\033[0m'
bold='\033[01m'
disable='\033[02m'
underline='\033[04m'
reverse='\033[07m'
strikethrough='\033[09m'
invisible='\033[08m'
class fg:
black='\033[30m'
red='\033[31m'
green='\033[32m'
orange='\033[33m'
blue='\033[34m'
purple='\033[35m'
cyan='\033[36m'
lightgrey='\033[37m'
darkgrey='\033[90m'
lightred='\033[91m'
lightgreen='\033[92m'
yellow='\033[93m'
lightblue='\033[94m'
pink='\033[95m'
lightcyan='\033[96m'
class bg:
black='\033[40m'
red='\033[41m'
green='\033[42m'
orange='\033[43m'
blue='\033[44m'
purple='\033[45m'
cyan='\033[46m'
lightgrey='\033[47m'
Попробуйте этот простой код
def prRed(prt): print("\033[91m {}\033[00m" .format(prt))
def prGreen(prt): print("\033[92m {}\033[00m" .format(prt))
def prYellow(prt): print("\033[93m {}\033[00m" .format(prt))
def prLightPurple(prt): print("\033[94m {}\033[00m" .format(prt))
def prPurple(prt): print("\033[95m {}\033[00m" .format(prt))
def prCyan(prt): print("\033[96m {}\033[00m" .format(prt))
def prLightGray(prt): print("\033[97m {}\033[00m" .format(prt))
def prBlack(prt): print("\033[98m {}\033[00m" .format(prt))
prGreen("Hello world")
# Pure Python 3.x demo, 256 colors
# Works with bash under Linux
fg = lambda text, color: "\33[38;5;" + str(color) + "m" + text + "\33[0m"
bg = lambda text, color: "\33[48;5;" + str(color) + "m" + text + "\33[0m"
def print_six(row, format):
for col in range(6):
color = row*6 + col + 4
if color>=0:
text = "{:3d}".format(color)
print (format(text,color), end=" ")
else:
print(" ", end=" ")
for row in range(-1,42):
print_six(row, fg)
print("",end=" ")
print_six(row, bg)
print()
Я знаю, что опаздываю. Но у меня есть библиотека под названием colorit. Это очень просто.
Вот некоторые примеры:
from colorit import *
# Use this to ensure that ColorIt will be usable by certain command line interfaces
init_colorit()
# Foreground
print(color("This text is red", Colors.red))
print(color("This text is orange", Colors.orange))
print(color("This text is yellow", Colors.yellow))
print(color("This text is green", Colors.green))
print(color("This text is blue", Colors.blue))
print(color("This text is purple", Colors.purple))
print(color("This text is white", Colors.white))
# Background
print(background("This text has a background that is red", Colors.red))
print(background("This text has a background that is orange", Colors.orange))
print(background("This text has a background that is yellow", Colors.yellow))
print(background("This text has a background that is green", Colors.green))
print(background("This text has a background that is blue", Colors.blue))
print(background("This text has a background that is purple", Colors.purple))
print(background("This text has a background that is white", Colors.white))
# Custom
print(color("This color has a custom grey text color", (150, 150, 150)))
print(background("This color has a custom grey background", (150, 150, 150)))
# Combination
print(
background(
color("This text is blue with a white background", Colors.blue), Colors.white
)
)
# If you are using Windows Command Line, this is so that it doesn't close immediately
input()
Это дает вам:
Также стоит отметить, что это кроссплатформенный и был протестирован на Mac, Linux и Windows.
Возможно, вы захотите попробовать: https://github.com/CodeForeverAndEver/colorit
Примечание: мигание, курсив, жирный шрифт и т. Д. Будут добавлены через несколько дней.
Редактировать: colorit
теперь доступен для установки с PyPi! Вы можете установить его с помощьюpip install color-it
в Windows и pip3 install color-it
в macOS и Linux.
В Windows вы можете использовать модуль 'win32console' (доступный в некоторых дистрибутивах Python) или модуль 'ctypes' (Python 2.5 и выше) для доступа к Win32 API.
Чтобы увидеть полный код, который поддерживает оба способа, см. Код отчетности цветовой консоли от Testoob.
Пример ctypes:
import ctypes
# Constants from the Windows API
STD_OUTPUT_HANDLE = -11
FOREGROUND_RED = 0x0004 # text color contains red.
def get_csbi_attributes(handle):
# Based on IPython's winconsole.py, written by Alexander Belchenko
import struct
csbi = ctypes.create_string_buffer(22)
res = ctypes.windll.kernel32.GetConsoleScreenBufferInfo(handle, csbi)
assert res
(bufx, bufy, curx, cury, wattr,
left, top, right, bottom, maxx, maxy) = struct.unpack("hhhhHhhhhhh", csbi.raw)
return wattr
handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
reset = get_csbi_attributes(handle)
ctypes.windll.kernel32.SetConsoleTextAttribute(handle, FOREGROUND_RED)
print "Cherry on top"
ctypes.windll.kernel32.SetConsoleTextAttribute(handle, reset)
Я обернул ответ @joeld в модуль с глобальными функциями, которые я могу использовать в любом месте моего кода.
файл: log.py
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = "\033[1m"
def disable():
HEADER = ''
OKBLUE = ''
OKGREEN = ''
WARNING = ''
FAIL = ''
ENDC = ''
def infog( msg):
print OKGREEN + msg + ENDC
def info( msg):
print OKBLUE + msg + ENDC
def warn( msg):
print WARNING + msg + ENDC
def err( msg):
print FAIL + msg + ENDC
использовать следующим образом:
import log
log.info("Hello World")
log.err("System Error")
Вот мое современное (2021 г.) решение:
Это одна из немногих библиотек, которые правильно поддерживают вложенные стили:
Кроме того, yachalk поддерживает автозаполнение, поддерживает 256 / truecolor, имеет функцию определения терминала и полностью типизирован.
Вот некоторые дизайнерские решения, которые вы можете принять во внимание при выборе своего решения.
Библиотеки высокого уровня против библиотек низкого уровня / ручная обработка стилей?
Многие ответы на этот вопрос демонстрируют, как напрямую использовать escape-коды ANSI, или предлагают низкоуровневые библиотеки, которые требуют ручного включения / отключения стиля.
У этих подходов есть тонкие проблемы: вставка стилей включения / выключения вручную
- более подробный синтаксически, потому что сбросы должны быть указаны явно,
- больше подвержено ошибкам, потому что вы можете случайно забыть сбросить стиль,
- не может правильно понять крайние случаи: например, в некоторых терминалах необходимо сбрасывать стили перед новой строкой и повторно активировать их после разрыва строки. Кроме того, некоторые терминалы имеют проблемы с простым переопределением взаимоисключающих стилей и требуют вставки «ненужных» кодов сброса. Если локальный терминал разработчика не имеет этих причуд, разработчик не сразу обнаружит эти причуды. О проблеме будут сообщать другие только позже, или она вызовет проблемы, например, на терминалах CI.
Поэтому, если целью является совместимость со многими терминалами, лучше всего использовать высокоуровневую библиотеку, которая предлагает автоматическую обработку сброса стилей. Это позволяет библиотеке позаботиться обо всех крайних случаях, вставляя «ложные» escape-коды ANSI там, где это необходимо.
Зачем нужна еще одна библиотека?
В JavaScript де-факто стандартной библиотекой для этой задачи является chalk, и после того, как она некоторое время использовалась в проектах JS, решения, доступные в мире Python, по сравнению с ней отсутствовали. Chalk API не только более удобен в использовании (полностью совместим с автозаполнением), но и позволяет правильно использовать все граничные случаи.
Идея ячалкyachalk состоит в том, чтобы обеспечить такое же удобство экосистемы Python. Если вас интересует сравнение с другими библиотеками, я начал сравнение функций на странице проектов. Кроме того, вот длинный (но все еще неполный) список альтернатив, которые возникли во время моего исследования - есть из чего выбирать :)
- цветной
- ansicolors
- срок цвет
- колорама
- свинарник
- благословения
- богатые
- цвет
- цветная печать
- цвет консоли
- Pyfance
- couleur
- стиль (ранее известный как clr)
- Пычалк
- простой мел
- члк
- меловой
def black(text):
print('\033[30m', text, '\033[0m', sep='')
def red(text):
print('\033[31m', text, '\033[0m', sep='')
def green(text):
print('\033[32m', text, '\033[0m', sep='')
def yellow(text):
print('\033[33m', text, '\033[0m', sep='')
def blue(text):
print('\033[34m', text, '\033[0m', sep='')
def magenta(text):
print('\033[35m', text, '\033[0m', sep='')
def cyan(text):
print('\033[36m', text, '\033[0m', sep='')
def gray(text):
print('\033[90m', text, '\033[0m', sep='')
black("BLACK")
red("RED")
green("GREEN")
yellow("YELLOW")
blue("BLACK")
magenta("MAGENTA")
cyan("CYAN")
gray("GRAY")
Я закончил тем, что делал это, я чувствовал, что это было самым чистым:
formatters = {
'RED': '\033[91m',
'GREEN': '\033[92m',
'END': '\033[0m',
}
print 'Master is currently {RED}red{END}!'.format(**formatters)
print 'Help make master {GREEN}green{END} again!'.format(**formatters)
Для Windows вы не можете печатать на консоли с цветами, если вы не используете win32api.
Для Linux это так же просто, как использовать print, с escape-последовательностями, описанными здесь:
Для того, чтобы символ печатался как коробка, он действительно зависит от того, какой шрифт вы используете для окна консоли. Символ фунта работает хорошо, но это зависит от шрифта:
#
Опираясь на ответ @joeld, используя https://pypi.python.org/pypi/lazyme pip install -U lazyme
:
from lazyme.string import color_print
>>> color_print('abc')
abc
>>> color_print('abc', color='pink')
abc
>>> color_print('abc', color='red')
abc
>>> color_print('abc', color='yellow')
abc
>>> color_print('abc', color='green')
abc
>>> color_print('abc', color='blue', underline=True)
abc
>>> color_print('abc', color='blue', underline=True, bold=True)
abc
>>> color_print('abc', color='pink', underline=True, bold=True)
abc
Скриншот:
Некоторые обновления color_print
с новыми форматерами, например:
>>> from lazyme.string import palette, highlighter, formatter
>>> from lazyme.string import color_print
>>> palette.keys() # Available colors.
['pink', 'yellow', 'cyan', 'magenta', 'blue', 'gray', 'default', 'black', 'green', 'white', 'red']
>>> highlighter.keys() # Available highlights.
['blue', 'pink', 'gray', 'black', 'yellow', 'cyan', 'green', 'magenta', 'white', 'red']
>>> formatter.keys() # Available formatter,
['hide', 'bold', 'italic', 'default', 'fast_blinking', 'faint', 'strikethrough', 'underline', 'blinking', 'reverse']
Замечания: italic
, fast blinking
а также strikethrough
может не работать на всех терминалах, не работает на Mac / Ubuntu.
Например
>>> color_print('foo bar', color='pink', highlight='white')
foo bar
>>> color_print('foo bar', color='pink', highlight='white', reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', bold=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', faint=True, reverse=True)
foo bar
>>> color_print('foo bar', color='pink', highlight='white', underline=True, reverse=True)
foo bar
Скриншот:
Тупо просто, основываясь на ответе @joeld
class PrintInColor:
RED = '\033[91m'
GREEN = '\033[92m'
YELLOW = '\033[93m'
LIGHT_PURPLE = '\033[94m'
PURPLE = '\033[95m'
END = '\033[0m'
@classmethod
def red(cls, s, **kwargs):
print(cls.RED + s + cls.END, **kwargs)
@classmethod
def green(cls, s, **kwargs):
print(cls.GREEN + s + cls.END, **kwargs)
@classmethod
def yellow(cls, s, **kwargs):
print(cls.YELLOW + s + cls.END, **kwargs)
@classmethod
def lightPurple(cls, s, **kwargs):
print(cls.LIGHT_PURPLE + s + cls.END, **kwargs)
@classmethod
def purple(cls, s, **kwargs):
print(cls.PURPLE + s + cls.END, **kwargs)
Тогда просто
PrintInColor.red('hello', end=' ')
PrintInColor.green('world')
Обратите внимание, насколько хорошо with
ключевые слова смешиваются с такими модификаторами, которые необходимо сбросить (используя Python 3 и Colorama):
from colorama import Fore, Style
import sys
class Highlight:
def __init__(self, clazz, color):
self.color = color
self.clazz = clazz
def __enter__(self):
print(self.color, end="")
def __exit__(self, type, value, traceback):
if self.clazz == Fore:
print(Fore.RESET, end="")
else:
assert self.clazz == Style
print(Style.RESET_ALL, end="")
sys.stdout.flush()
with Highlight(Fore, Fore.GREEN):
print("this is highlighted")
print("this is not")
Вы можете использовать CLINT:
from clint.textui import colored
print colored.red('some warning message')
print colored.green('nicely done!')
Эмодзи
Вы можете использовать цвета для текста, как другие, упомянутые в их ответах, чтобы иметь красочный текст с цветом фона или переднего плана.
Но вместо этого вы можете использовать эмодзи! например, вы можете использовать⚠️
для предупреждающих сообщений и
для сообщений об ошибках.
Или просто используйте эти записные книжки как цветные:
: error message
: warning message
: ok status message
: action message
: canceled status message
: Or anything you like and want to recognize immediately by color
Бонус:
Этот метод также помогает быстро сканировать и находить журналы прямо в исходном коде.
Но шрифт emoji по умолчанию в Linux по умолчанию не является красочным, и вы можете сначала сделать их красочными.
Вы можете использовать реализацию библиотеки curses на Python: http://docs.python.org/library/curses.html
Кроме того, запустите это, и вы найдете свой ящик:
for i in range(255):
print i, chr(i)
Если вы программируете игру, возможно, вы хотели бы изменить цвет фона и использовать только пробелы? Например:
print " "+ "\033[01;41m" + " " +"\033[01;46m" + " " + "\033[01;42m"
Одним из более простых вариантов будет использование cprint
функция от termcolor
пакет.
Также поддерживает %s, %d
формат печати
Самый простой и удобный способ сделать это, если вы пишете инструмент командной строки. Этот метод будет работать везде на всех консолях, без установки каких-либо причудливых пакетов.
Чтобы коды ANSI работали в Windows, сначала запуститеos.system('color')
import os
os.system('color')
COLOR = '\033[91m' # change it, according to the color need
END = '\033[0m'
print(COLOR + "Hello World" + END) #print a message
exit=input() #to avoid closing the terminal windows
Для большего количества цветов :
Примечание: \33[5m и \33[6m мигают.
Благодаря @qubodup