Как стать автором
Обновить

Комментарии 20

При всех этих играх с цветами бесит то, что при других настройках терминала (запуск на другом компе) вывод может быть крайне уродлив. Особенно все эти темы цветовые...

Похоже на проблему вёрстки в браузерах.

Хуже того, разные терминалы поддерживают разный набор фич. Причём совершенно без всякой логики. К примеру, urxvt не поддерживает dim color (\e[2m). Причём цвета вполне поддерживает, а такую мелочь разработчики не удосужились сделать.
В других терминалах аналогичные проблемы, но каждый раз разные.

Не могу не добавить к такой статье
мой вариант раскраски приглашения командной строки.
.bashrc
PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]\t\[\e[00m\] \[\e[01\;32m\]\(^_^\)\[\e[00m\] \[\e[32m\]\u\[\e[33m\]@\[\e[32m\]\h\[\e[00m\]; else echo \[\e[31m\]\t\[\e[00m\] \[\e[01\;41m\]\(O_o\)\[\e[00m\] \[\e[33m\]\u\[\e[31m\]@\[\e[33m\]\h\[\e[00m\]; fi\`\[\e[01;34m\] [ \w ]\[\e[00m\]\n⌎ ${debian_chroot:+($debian_chroot)}\[\e[01;32m\]\!\[\e[01;34m\] \$\[\e[00m\] "

PS: Тут есть не совсем стандартный символ: "⌎".

Помню как мучился, когда пытался его написать и разбирался с цветами и управляющими последовательностями. Уже и не помню, почему использовал конструкцию с "\e", которой в статье не заметил.
Может, разъясните, что здесь и как. А то выглядит как предложение форк бомбы.

Если бы я ещё помнил. Я в 2018 году это сделал или даже раньше. Сейчас попробую вспомнить. За основу я взял статью по адресу: http://www.calculate-linux.org/blogs/ru/193/show

В принципе, там всё расписано, но я распишу конкретно на моём примере.

Много-много текста: подробный разбор

Стандартное приглашение в моей системе выглядело так:

PS1="[\u@\h \W]\$ "
  • [ — символ "["

  • \u — логин пользователя @ — "@"

  • \h — имя хоста

  • " " — пробел

  • \W — рабочий каталог/дирректория/папка

  • "\$ " — символы "]$ "

Наиболее близкой частью этой конструкции, является вот эта часть кода:

"\n⌎ ${debian_chroot:+($debian_chroot)}\[\e[01;32m\]\!\[\e[01;34m\] \$\[\e[00m\] "
  • \n — символ перевода строки.

  • "⌎ " — это просто два символа "⌎" и пробел.

  • ${debian_chroot:+($debian_chroot)} — https://askubuntu.com/questions/372849/what-does-debian-chrootdebian-chroot-do-in-my-terminal-prompt

  • \[ —

  • \e[01;32m — \033[1;32m — активируем стиль: жирный зелёный

  • \] —

  • \e[01;34m — \033[1;34m — активируем стиль: жирный синий

  • \] —

  • \! — номер текущей команды

  • \] —

  • " \$" — это пробел и $

  • \[ —

  • \e[00m — \033[0m — сброс текущего стиля к изначальному

  • \] —

  • " " — пробел

Вообще, конструкции "\[" и "\]" тут что-то вроде визуальной обёртки. Не помню, зачем их вставил. Если их убрать, будет:

"\n⌎ ${debian_chroot:+($debian_chroot)}\e[01;32m\!\e[01;34m \$\e[00m "

Помимо этого, мною добавлены были лишние символы 0, до двухсимвольных конструкций. Их тоже можно убрать.

"\n⌎ ${debian_chroot:+($debian_chroot)}\e[1;32m\!\e[1;34m \$\e[0m "

Лично мне, такую конструкцию воспринимать сложнее.

Ещё можно поменять \e на \033

"\n⌎ ${debian_chroot:+($debian_chroot)}\033[1;32m\!\033[1;34m \$\033[0m "

Это - рабочая конструкция:

PS1="\n⌎ ${debian_chroot:+($debian_chroot)}\033[1;32m\!\033[1;34m \$\033[0m "

Можно попробовать ввести её в консоль.

Конструкция:

"\`if [ \$? = 0 ]; then echo … ; else echo … ; fi\`"

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

Именно вот эту конструкцию из статьи:

"PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\`[\u@\h:\w]\\$ "

я вроде бы брал за основу.

Строки:

echo \[\e[33m\]\t\[\e[00m\] \[\e[01\;32m\]\(^_^\)\[\e[00m\] \[\e[32m\]\u\[\e[33m\]@\[\e[32m\]\h\[\e[00m\];

и

echo \[\e[31m\]\t\[\e[00m\] \[\e[01\;41m\]\(O_o\)\[\e[00m\] \[\e[33m\]\u\[\e[31m\]@\[\e[33m\]\h\[\e[00m\];

повторяют друг-друга по конструкции, но отличаются деталями. ; приходится экранировать из-за конструкции if.

  • \e[33m — активируем стиль: жёлтый

  • \e[31m — активируем стиль: красный

  • \t — время

  • \e[00m — сброс стиля

  • " " — пробел

  • \e[01\;32m — \033[1;32m — активируем стиль: жирный зелёный

  • \e[01\;41m — \033[1;41m — активируем стиль: жирный и красный фон

  • "\(^_^\)\" — довольная рожица

  • "\(O_o\)\" — удивлённая рожица

  • \e[00m — \033[0m — сброс стиля

  • " " — пробел

  • \e[32m — \033[32m — активируем стиль: зелёный

  • \e[33m — \033[33m — активируем стиль: жёлтый

  • \u — логин пользователя

  • \e[33m — \033[33m — активируем стиль: жёлтый

  • \e[31m — \033[31m — активируем стиль: красный

  • @ — "@"

  • \e[32m — \033[32m — активируем стиль: зелёный

  • \e[33m — \033[33m — активируем стиль: жёлтый

  • \h — имя хоста

  • \e[00m — \033[0m — сброс стиля

Остался вот этот кусочек:

[\e[01;34m\] [ \w ]\[\e[00m\]
  • \e[01\;34m — \033[1;34m — активируем стиль: жирный синий

  • " [ " — " [ " \w — рабочий каталог/дирректория/папка

  • " ] " — " ] "

  • \e[00m — \033[0m — сброс стиля

Теперь, по прошествии ремени и ещё раз разобравшись со всмем заного, я могу всё переписать в стиле статьи, убрав лишнее.

Было:

.bashrc

PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]\t\[\e[00m\] \[\e[01\;32m\]\(^_^\)\[\e[00m\] \[\e[32m\]\u\[\e[33m\]@\[\e[32m\]\h\[\e[00m\]; else echo \[\e[31m\]\t\[\e[00m\] \[\e[01\;41m\]\(O_o\)\[\e[00m\] \[\e[33m\]\u\[\e[31m\]@\[\e[33m\]\h\[\e[00m\]; fi\`\[\e[01;34m\] [ \w ]\[\e[00m\]\n⌎ ${debian_chroot:+($debian_chroot)}\[\e[01;32m\]\!\[\e[01;34m\] \$\[\e[00m\] "

Стало:

.bashrc

PS1="\`if [ \$? = 0 ]; then echo \e[33m\t\e[0m \e[1\;32m\(^_^\)\e[0m \e[32m\u\e[33m@\e[32m\h\e[0m; else echo \e[31m\t\e[0m \e[1\;41m\(O_o\)\e[0m \e[33m\u\e[31m@\e[33m\h\e[0m; fi\`\e[1;34m [ \w ]\e[0m\n⌎ ${debian_chroot:+($debian_chroot)}\e[1;32m\!\e[1;34m \$\e[0m "

Если заменить "\e" на "\033", то получится ближе к тексту статьи:

.bashrc

PS1="\`if [ \$? = 0 ]; then echo \033[33m\t\033[0m \033[01\;32m\(^_^\)\033[0m \033[32m\u\033[33m@\033[32m\h\033[0m; else echo \033[31m\t\033[0m \033[1\;41m\(O_o\)\033[0m \033[33m\u\033[31m@\033[33m\h\033[0m; fi\`\033[1;34m [ \w ]\033[0m\n⌎ ${debian_chroot:+($debian_chroot)}\033[1;32m\!\033[1;34m \$\033[0m "

И оно вроде как даже работает, но "глючит" при навигации по истории, например. В отличие от изначальной конструкции. Может, конструкции "\[" и "\]" были нужны или что-то лишнее удалил случайно, когда переписывал. Искать проблему сейчас — лень, но думаю, смысл я объяснил. Сам предпочту пользоваться старой конструкцией, проверенной мною же.

А еще бывает, что эти последовательности попадают в логи, и вот поди под них напиши нормальный regex чтобы нужное поле вытащить.
Если дело дошло даже до раскраски, то можно сделать 2 разных вывода — один для человека в консоли, второй для удобного парсинга логов. Текст при этом тоже может отличаться.

man console_codes

Там и про разные терминалы есть.

Надо, но в меру. Просто не надо злоупотреблять. Не надо превращать консоль в подобие сайта начала нулевых (еще гифок анимированных не хватает, да!)

Является ли какой-нибудь midnight commander злоупотреблением?

К слову, в консоли вполне можно и изображения выводить:
https://habr.com/ru/post/543594/

А вот какой эмулятор терминала под виндой поддерживает эту фичу?Хотелось бы выводить с микроконтроллера в терминал обмен с отлаживаемым устройством разными цветами.

Использую putty для всего. Цвета и прочие радости работают.

wezterm. Но там надо конфиг на луа писать, хоть сам терминал и на расте написан

У меня Conemu прекрасно ANSI цвета выводил.

А вообще, новый родной(от Майкрософта) терминал в десятке из коробки понимает ANSI. Так информация устарела, что в Windows всё плохо.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий