Комментарии 79
интересно.
А вообще еще можно посмотреть в сторону grc, например, который из коробки умеет раскрашивать некоторое количество общеизвестных утилит.
Автор молодец, такое сделать.
А вообще еще можно посмотреть в сторону grc, например, который из коробки умеет раскрашивать некоторое количество общеизвестных утилит.
Автор молодец, такое сделать.
Раскрашивать общеизвестные утилиты нынче только ленивый не умеет. Но все (все!) они используют олдскульные 16 цветов. И
Я говорю а) про свой лог и б) про настройку любых сторонних утилит раскраски пастельными цветами.
grc
(который, как и всякий комбайн, заведомо проигрывает vimdiff+tig
для гита, ну и так далее) — тоже пугает вырвиглазностью.Я говорю а) про свой лог и б) про настройку любых сторонних утилит раскраски пастельными цветами.
А пример не могли бы привести, к примеру, для какого-нить лога, если Вам не сложно.
А то я что-то сходу и не могу понять, как раскрашивать уже лежащий на винте чисто текстовый лог, например.
А то я что-то сходу и не могу понять, как раскрашивать уже лежащий на винте чисто текстовый лог, например.
Ну и PS1, конечно, переписан с нуля.
Не мучайте себя, возьмите zsh. Здесь цвета сокращаются до
%F{blue}…%f
/%K{blue}…%k
(только первые 16, остальные имеют число вместо имени) (Foreground, bacKground), %B…%b
для жирного, %U…%u
— подчеркнутого и %S…%s
— инверсного (похоже zsh не предоставляет возможности сделать текст наклонным с помощью %{char}
. Не представляет проблемы, так как konsole и xterm всё равно это не поддерживают, только urxvt).Спасибо за совет, я уже и не вспомню, сколько лет назад перешел на
И, честно признаться, я все равно не способен в голове высчитать число, которое нужно запихнуть в
zsh
. Чисто смеха ради, могу сказать, что цветной промпт, который я держу в гите вместе с другими настройками иногда выкатывается на чужие машины. Где, сюрприз, иногда бывают другие шеллы. Да и коллеги мои не всегда хотят на него переходить. Странно, правда, заставлять человека для чтения логов накатить другой шелл?И, честно признаться, я все равно не способен в голове высчитать число, которое нужно запихнуть в
%F
, чтобы получить бирюзовый на алом. А моему скрипту все равно, что генерировать.Накатить для логов — нет. Когда меня попросили добавить в formatvim вывод с помощью ANSI escape последовательностей, мне тоже пришлось с этим разбираться. А вот писать PS1 в таком виде я бы никогда не стал. Точно так же, как не стал бы использовать в PS1 что‐то, кроме первых 16 цветов — мне ещё случается работать во framebuffer.
Относительно PS1 в других оболочках — я в этом отношении предпочитаю оставить приглашение по‐умолчанию или, в любом случае, отличное от того, что у меня в zsh, чтобы оно всегда напоминало мне о том, что это другая оболочка, в которой недоступны привычные мне возможности zsh.
А чем вам
Кроме того я не предлагаю прямо эти кракозябры лепить. Можно же свой
if
не угодил-то? Framebuffer вам скажет «linux» на «echo $TERM». Кроме того я не предлагаю прямо эти кракозябры лепить. Можно же свой
%F
написать.Здорово! спасибо!
По ссылке пишут про «TERM=xterm256color», а в статье про «TERM=xterm-256color». Вопрос: в чём правда, брат? =)
grep и tail цветных логов взрывает мне мозг.
Ну так приличный софт проверяет, что за терминал используется, подсвечивая выхлоп цветом только если это действительно терминал, а не файл или труба.
leto имеет в виду
run_with_log | grep ERROR
.Дык, вы же выхлоп run_with_log отправляете в трубу. Следовательно, если этот самый run_with_log написан по-человечески, мусора в grep не будет.
Научите, пожалуйста, изнутри run_with_log определить, что мой вывод перенаправили в пайп.
Пожалуйста.
Код
#include <stdio.h>
#include <unistd.h>
#define RED "\033[1;32;41m"
#define GREEN "\033[5;30;42m"
#define OLDCOLOR "\033[0;0;0m"
main(){
if(isatty(STDOUT_FILENO)) printf(RED "This is a TTY! " GREEN "Output may be colorized!" OLDCOLOR "\n");
else printf("This is pipe, no colors!\n");
}
Выхлоп

Вот уж воистину: век живи — век учись. Спасибо!
А вот так можно сделать цветной printf
#define RED "\033[1;31;40m"
#define GREEN "\033[1;32;40m"
#define OLDCOLOR "\033[0;0;0m"
int (*red)(const char *fmt, ...);
int (*green)(const char *fmt, ...);
int r_pr_(const char *fmt, ...){
va_list ar; int i;
printf(RED);
va_start(ar, fmt);
i = vprintf(fmt, ar);
va_end(ar);
printf(OLDCOLOR "\n");
return i;
}
int g_pr_(const char *fmt, ...){
va_list ar; int i;
printf(GREEN);
va_start(ar, fmt);
i = vprintf(fmt, ar);
va_end(ar);
printf(OLDCOLOR "\n");
return i;
}
int main(int argc, char *argv[]){
if(isatty(STDOUT_FILENO)){ // make color output in tty
red = r_pr_; green = g_pr_;
}else{ // no colors in case of pipe
red = printf; green = printf;
}
…
red("Красный текст\n");
…
green("Зеленый текст\n");
}
«Раньше были времена, а теперь мгновения. Раньше поднимался …, а теперь — давление.»
Кто ж нынче на си-то вывод раскрашивает? А на руби это две строчки ;-)
Кто ж нынче на си-то вывод раскрашивает? А на руби это две строчки ;-)
> Кто ж нынче на си-то вывод раскрашивает?
Я раскрашиваю. Язык простой, да и не знаю я больше ни одного ЯП, кроме С (мне и не надо — работа с программированием почти не связана). А хочется иной раз цветом важные моменты «выхлопа» программы подчеркнуть.
Я раскрашиваю. Язык простой, да и не знаю я больше ни одного ЯП, кроме С (мне и не надо — работа с программированием почти не связана). А хочется иной раз цветом важные моменты «выхлопа» программы подчеркнуть.
Во-первых, вы знаете еще как минимум shell script. Во-вторых — это во мне ностальгия разговаривает вместо меня самого.
Я всегда считал, что если человек задумывается о «выхлопе» — это настоящий программист. А если знает 800 языков — еще не факт.
Я всегда считал, что если человек задумывается о «выхлопе» — это настоящий программист. А если знает 800 языков — еще не факт.
Python
import sys
RED = "\033[1;32;41m"
GREEN = "\033[5;30;42m"
OLDCOLOR = "\033[0;0;0m"
if sys.stdout.isatty():
print("".join([
RED,
"This is a TTY! ",
GREEN,
"Output may be colorized!",
OLDCOLOR
]))
else:
print("This is pipe, no colors!")
Перед пайпом на grep или tail:
sed -e '/\e[.*m//g'
а в ubuntu 12.04 если через putty подключаться (а там сказать что TERM=xterm-256color и что PuTTY поддерживает 256 цветов рапортовать) — не показывает 256 цветов.
кто-нить с этим работал?
p.s. проверял code.google.com/p/eddys-bash-scripts/source/browse/colors этим
кто-нить с этим работал?
p.s. проверял code.google.com/p/eddys-bash-scripts/source/browse/colors этим
А есть пример того, как оно должно выглядеть?
Я не люблю доверять скриптам, в которых такая кодировка. Кроме того там явно видны циклы
Попробуйте на целевой убунте «
seq 30 37
, что тоже не особо радует.Попробуйте на целевой убунте «
sudo apt-get install ncurses-term
». Тот скрипт — для 16 цветов.
Вот — он же для полного вырвиглазия:
Вот — он же для полного вырвиглазия:
Скрытый текст
#!/bin/bash
TERM="xterm-256color"
COLRS="$(seq 1 8 256)"
for A in 1 2 4 5 7 8 9
do
echo -e "\033[0m\n\n Свойство $A:\n"
for B in $COLRS
do
echo -e "\nЦвет $B\c"
for C in $COLRS
do
echo -e "\033[$A;38;05;$B;48;05;$C""m Фон $C\t\c"
done
echo -e "\033[0m\c"
done
done
echo -e "\033[0m\n\n"
> последовательность «\e[01;04;38;05;196;48;05;232m» включит режим жирного подчеркнутого красного на черном фоне.
Не нужно ESC коды писать. Здесь вам не DOS.
Не нужно ESC коды писать. Здесь вам не DOS.
echo -e "`tput bold; tput smul; tput setaf 196; tput setab 232`bold-underline-red-on-black"
man terminfo
Замечу, что в Mac OS X (терминал iTerm2) так же работает, но пример с сайта из топика надо модифицировать:
Отличие — в кавычках при установке MY_CLR.
$ export MY_CLR=$'\e[01;38;05;108;48;05;17m'
$ echo "${MY_CLR}Hello"
Отличие — в кавычках при установке MY_CLR.
Когда я выйду на пенсию, я допишу проверку браузера посетителя и генерацию правильного примера ;-)
Ну это же просто пример, смысл-то в последовательности. В смысле, если вам зачем-то нужна эта последовательность, то вы уж наверняка знаете, как в вашем шелле принято переменные объявлять.
Ну это же просто пример, смысл-то в последовательности. В смысле, если вам зачем-то нужна эта последовательность, то вы уж наверняка знаете, как в вашем шелле принято переменные объявлять.
Ну это верно, я статью прочёл с удовольствием, но решил оставить «хинт» для маководов, ленящихся экспериментировать ;)
Кстати, раз уж Вы всё равно займётесь этим сервисом на пенсии, сделайте, пожалуйста, генерацию и для zsh тоже. Мне вот для проверки пришлось bash включать. Хотя, для скриптов обычно именно bash идёт, так что у меня всё ок в принципе =)
Кстати, раз уж Вы всё равно займётесь этим сервисом на пенсии, сделайте, пожалуйста, генерацию и для zsh тоже. Мне вот для проверки пришлось bash включать. Хотя, для скриптов обычно именно bash идёт, так что у меня всё ок в принципе =)
Уточните, пожалуйста, в чем именно проблема.
Я сам на
Я сам на
zsh
и все тестировалось там же. У вас, судя по всему, что-то с TERM
в zsh не алё.Собственно, выглядит так:

А TERM задаётся в настройках iTerm2 и по умолчанию «xterm-256color», так что тут менять ничего не надо =)

А TERM задаётся в настройках iTerm2 и по умолчанию «xterm-256color», так что тут менять ничего не надо =)
Ой.
А можно вас попросить попробовать вместо «\e» — «\033» и, особенно, настоящий Esc (вводится последовательным нажатием клавиш «Ctrl+V» и «Escape»)? Я повторить на zsh@ubuntu не могу.
А можно вас попросить попробовать вместо «\e» — «\033» и, особенно, настоящий Esc (вводится последовательным нажатием клавиш «Ctrl+V» и «Escape»)? Я повторить на zsh@ubuntu не могу.
С 033 и escape — то же самое. Может быть дело в oh-my-zsh?
У меня тоже oh-my-zsh (у нас даже тема одна почти и та же, если вглядеться в мой пример на сайте). Дело, кажется, в разворачивании переменной. Ваш шелл почему-то всегда ${AAA} хочет выплюнуть на stdout.
Я попробую дотянуться до мака и починить, конечно же.
Я попробую дотянуться до мака и починить, конечно же.
export MY_CLR=$'ONE'
echo "${MY_CLR}"
— два раза «ONE» печатает?
попробуйте
и у меня не заработало с \e, но заработало с \033
echo -e "${MY_CLR}Hello"
и у меня не заработало с \e, но заработало с \033
Увы, результат аналогичный. =(
macbook-011:~$ zsh
macbook-011% echo $TERM
xterm-color
macbook-011% export A='\033[01;38;05;108;48;05;17m'
macbook-011% echo -e "${A}Hello"
Hello
macbook-011%
Hello ярко белый и моргает
Кстати да, если без $ строку объявлять, а просто в одинарных кавычках, то всё работает.
Хм.
Спасибо! =)
Хм.
Спасибо! =)
Спасибо!
Только поясните, что значит «моргает»? И почему ярко-белый? Иными словами, если вы возьмете с сайта какой-нибудь вариант типа «\033[01;04;38;05;160;48;05;222m» (жирный красный на желтом с подчеркиванием) — он именно так отобразится? Или для мака (как обычно ;-)) все переписывать придется?
Только поясните, что значит «моргает»? И почему ярко-белый? Иными словами, если вы возьмете с сайта какой-нибудь вариант типа «\033[01;04;38;05;160;48;05;222m» (жирный красный на желтом с подчеркиванием) — он именно так отобразится? Или для мака (как обычно ;-)) все переписывать придется?
Похоже, вынужден Вас огорчить, ибо "\033[01;04;38;05;160;48;05;222m" у меня на маке (с xterm-color) отображается как подчеркнутый яркий белый, мигающий.
Но, в никсах, при том же xterm-color (не 256color, может в этом причина) отображается так же.
Но, опять-таки, может дело в моем терминале.
Но, в никсах, при том же xterm-color (не 256color, может в этом причина) отображается так же.
Но, опять-таки, может дело в моем терминале.

У меня вот так, а мигающего добиться не удалось =)
не 256color, может в этом причина
Конечно, причина в этом. Я даже в записи об этом обмолвился.
export TERM=xterm-256color
— должно помочь.
$ bash
macbook-011:~$ echo $TERM
xterm-color
macbook-011:~$ export A="\033[01;38;05;108;48;05;17m"
macbook-011:~$ echo -e "${A}Hello"
Hello
macbook-011:~$ export A="\e[01;38;05;108;48;05;17m"
macbook-011:~$ echo -e "${A}Hello"
\e[01;38;05;108;48;05;17mHello
macbook-011:~$ export TERM=xterm-256color
macbook-011:~$ echo $TERM
xterm-256color
macbook-011:~$ export A="\033[01;38;05;108;48;05;17m"
macbook-011:~$ echo -e "${A}Hello"
Hello
macbook-011:~$ export A="\e[01;38;05;108;48;05;17m"
macbook-011:~$ echo -e "${A}Hello"
\e[01;38;05;108;48;05;17mHello
$ zsh
macbook-011% echo $TERM
xterm-color
macbook-011% export A="\033[01;38;05;108;48;05;17m"
macbook-011% echo -e "${A}Hello"
Hello
macbook-011% export A="\e[01;38;05;108;48;05;17m"
macbook-011% echo -e "${A}Hello"
Hello
macbook-011% export TERM=xterm-256color
zsh: can`t find terminal definition for xterm-256color
macbook-011% echo $TERM
xterm-256color
macbook-011% export A="\033[01;38;05;108;48;05;17m"
macbook-011% echo -e "${A}Hello"
Hello
macbook-011% export A="\e[01;38;05;108;48;05;17m"
macbook-011% echo -e "${A}Hello"
Hello
Во всех случаях текст выглядит одинаково: яркий, белый, мигающий.
Да, так и отображается, всё ок.
Ярко-белый у меня не моргает — уж не знаю почему =)
Ярко-белый у меня не моргает — уж не знаю почему =)
Я это… читаю комментарии к своей записи :-).
Там пока есть вопросы: habrahabr.ru/post/161999/#comment_5563239
У вас получается то, что нужно? Я просто почти вышел на пенсию и готов допилить правильный показ команды. Но мака под рукой по-прежнему нет.
Там пока есть вопросы: habrahabr.ru/post/161999/#comment_5563239
У вас получается то, что нужно? Я просто почти вышел на пенсию и готов допилить правильный показ команды. Но мака под рукой по-прежнему нет.
Вкратце для макоси в zsh надо:
1. Делать экспорт надо в одинарных кавычках.
2. Вместо "\e" ставить "\033".
Для bash же надо оставить "\e" — 033 там не работает почему-то.
1. Делать экспорт надо в одинарных кавычках.
2. Вместо "\e" ставить "\033".
Для bash же надо оставить "\e" — 033 там не работает почему-то.
Ога. На страничке все поправил уже. Вот только баш, или zsh, — у человека, пришедшего ко мне на сайт, я определять не умею.
Посоветуйте, как правильно оставить «заглавную строку»? Я сейчас к «\033» склонился, плюс там же есть еще блок «варианты».
Посоветуйте, как правильно оставить «заглавную строку»? Я сейчас к «\033» склонился, плюс там же есть еще блок «варианты».
Мне кажется, лучше в блоке с вариантами сделать подсказку: это для bash, это для zsh.
Моя убунта понимает оба, доступный rhel — только ровно наоборот вашему рассказу.
В общем, я постараюсь охватить все многообразие, но держу в уме, что если уж кто-то пришел за esc-последовательностью, дальше он сам справится.
Это негодный паттерн, я понимаю. Но у меня следующая запись в эти блоги рискует быть гораздо интереснее.
В общем, я постараюсь охватить все многообразие, но держу в уме, что если уж кто-то пришел за esc-последовательностью, дальше он сам справится.
Это негодный паттерн, я понимаю. Но у меня следующая запись в эти блоги рискует быть гораздо интереснее.
Хорошая ссылка по теме: frexx.de/xterm-256-notes/
Есть ссылки на perl-скрипты для отображения набора всех цветов в консоли: один скрипт показывает все цвета с их номерами (xterm-colortest), другой — просто красивый color cube (256colors2.pl).
Также в самом конце есть совет, как «включить» 256 цветов в screen'ах.
Есть ссылки на perl-скрипты для отображения набора всех цветов в консоли: один скрипт показывает все цвета с их номерами (xterm-colortest), другой — просто красивый color cube (256colors2.pl).
Также в самом конце есть совет, как «включить» 256 цветов в screen'ах.
Ага, спасибо, вынес в запись. Поделитесь секретом, о чем нужно спросить гугл, чтобы он это отдал?
;-)
;-)
Т.к. у меня на фре в screen'ах не отображались 256 цветов (и скрины и xterm собраны с поддержкой 256 цветов), я гуглил по «freebsd screen 256 color». Третья ссылка (http://www.in-nomine.org/2005/09/20/screen-256-colours-and-termcap-mixed-with-putty-and-freebsd/ — в статье, кстати, есть рецепт и для vim'а, но мне он не пригодился), последний комментарий и ведёт на frexx.de/xterm-256-notes/ =)
Кстати, у меня xterm и с TERM=xterm показывает 256 цветов. Т.е. изменение TERM на FreeBSD вообще не потребовалось. В том числе и для screen'ов.
Кстати, у меня xterm и с TERM=xterm показывает 256 цветов. Т.е. изменение TERM на FreeBSD вообще не потребовалось. В том числе и для screen'ов.
Охтыж!
Вспомнил смешную историю.
Меня как-то коллега попросил помочь нагуглить решение какой-то проблемы. Я занят был, поэтому лаконично посоветовал: «добавляй ко мне запросам „slackware“». Еще два года вся команда на любой мой вопрос (типа «кофе идем пить?») хором отвечала: «а слакварь с нами?».
Ну теперь я знаю, что «freebsd» — тоже ключевое словцо.
Вспомнил смешную историю.
Меня как-то коллега попросил помочь нагуглить решение какой-то проблемы. Я занят был, поэтому лаконично посоветовал: «добавляй ко мне запросам „slackware“». Еще два года вся команда на любой мой вопрос (типа «кофе идем пить?») хором отвечала: «а слакварь с нами?».
Ну теперь я знаю, что «freebsd» — тоже ключевое словцо.
Если интересно, у меня есть скрипт, который выдаёт список из #RRGGBB кодов всех цветов для текущего терминала. Для работы требуется Vim, wmctrl (желательно), perl, YAML::XS, imagemagick (консольные команды и perl bindings). Желательно, чтобы окно терминала не имело декораций. Код, определяющий месторасположение таблицы цветов, по идее, должен работать с почти всеми декорациями, но медленно. Для работы также требуется, чтобы чёрный фон отличался от белого. Никаких более требований нету.
Там же — списки цветов для используемых мною терминалов (откуда я взял default-8 уже не помню, у wineconsole цвета другие). Цвета у всех используемых мною эмуляторов (rxvt-unicode USE+=256-color, xterm, konsole) везде одинаковые, первые 16 цветов у konsole отличаются (и настраиваются). Насколько мне известно, как минимум xterm позволяет настраивать вообще все цвета.
Там же — списки цветов для используемых мною терминалов (откуда я взял default-8 уже не помню, у wineconsole цвета другие). Цвета у всех используемых мною эмуляторов (rxvt-unicode USE+=256-color, xterm, konsole) везде одинаковые, первые 16 цветов у konsole отличаются (и настраиваются). Насколько мне известно, как минимум xterm позволяет настраивать вообще все цвета.
Та не, «freebsd» в запросе было не просто для количества =) Судя по тэгам статьи, Вы экспериментировали под linux'ом. Я же работаю на фре. И по опыту знаю, что, если гуглить что-то по nix-тематике без конкретизации, то linux'овых решений будут столько, что найти нужное для freebsd будет проблематично. Тем более, что изредка даже linux'овые решения не подходят разным веткам linux'ов =)
Так что тут просто привычка сработала: конкретизировать запросы, чтобы не копаться в ненужном — раз у Вас под linux'ом всё работает, вероятно проблема имеет какую-то особенность именно на фре =)
ps: случайно ответил не в трид, а теперь не знаю, как удалить сообщение или переместить его в нужный трид =( сорри.
Так что тут просто привычка сработала: конкретизировать запросы, чтобы не копаться в ненужном — раз у Вас под linux'ом всё работает, вероятно проблема имеет какую-то особенность именно на фре =)
ps: случайно ответил не в трид, а теперь не знаю, как удалить сообщение или переместить его в нужный трид =( сорри.
Как минимум, в Konsole есть TrueColor:
There is a predefined 256 color space compatible with his
xterm sister, and, even beyond that, a 3-byte RGB color space.
The ESC codes are as follows
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
256 цветов в терминале ⇒ уровень nightmare