как вывести цветной текст на терминал linux?

<p>как распечатать цветные символы на терминале linux, который его поддерживает?</p><p>как мне узнать, поддерживает ли терминал цветовые коды?</p>

<p>вам нужно вывести <a href="http://en.wikipedia.org/wiki/ansi\_escape\_code">цветовые коды ansi</a> . обратите внимание, что не все терминалы поддерживают это; если цветовые последовательности не поддерживаются, мусор будет отображаться.</p><p>пример:</p><pre><code> cout << "\033[1;31mbold red text\033[0m\n"; </code></pre><p>здесь <code>\033</code> - это символ esc, ascii 27. за ним следует <code>[</code>, затем ноль или более чисел, разделенных <code>;</code>, и, наконец, буква <code>m</code>. числа описывают цвет и формат для переключения с этого момента.</p><p>коды для цветов переднего плана и фона:</p><pre><code> foreground background black 30 40 red 31 41 green 32 42 yellow 33 43 blue 34 44 magenta 35 45 cyan 36 46 white 37 47 </code></pre><p>кроме того, вы можете использовать эти:</p><pre><code>reset 0 (everything back to normal) bold/bright 1 (often a brighter shade of the same colour) underline 4 inverse 7 (swap foreground and background colours) bold/bright off 21 underline off 24 inverse off 27 </code></pre><p>смотрите <a href="http://en.wikipedia.org/wiki/ansi\_escape\_code#graphics">таблица в википедии</a> для других, менее широко поддерживаемых кодов.</p><hr><p>чтобы определить, поддерживает ли ваш терминал цветовые последовательности, прочитайте значение переменной среды <code>term</code>. он должен указывать конкретный тип используемого терминала (например, <code>vt100</code>, <code>gnome-terminal</code>, <code>xterm</code>, <code>screen</code>, ...). затем найдите это в <a href="http://linux.die.net/man/5/terminfo">база данных terminfo</a> ; проверьте возможность <code>colors</code>.</p>

<h2>основы</h2><p>я написал класс c++, который можно использовать для установки цвета переднего плана и фона для вывода. этот пример программы служит примером печати <code>this ->word<- is red.</code> и форматирования его так, чтобы цвет переднего плана <code>word</code> был красным.</p><pre><code>#include "colormod.h" // namespace color #include <iostream> using namespace std; int main() { color::modifier red(color::fg\_red); color::modifier def(color::fg\_default); cout << "this ->" << red << "word" << def << "<- is red." << endl; } </code></pre><h3>источник</h3><pre><code>#include <ostream> namespace color { enum code { fg\_red = 31, fg\_green = 32, fg\_blue = 34, fg\_default = 39, bg\_red = 41, bg\_green = 42, bg\_blue = 44, bg\_default = 49 }; class modifier { code code; public: modifier(code pcode) : code(pcode) {} friend std::ostream& operator<<(std::ostream& os, const modifier& mod) { return os << "\033[" << mod.code << "m"; } }; } </code></pre><h2>продвинутый</h2><p>вы можете добавить дополнительные функции в класс. например, можно добавить цвет пурпурный и даже такие стили, как <strong> жирный шрифт </strong>. для этого просто добавьте еще одну запись в перечисление <code>code</code>. <a href="http://misc.flogisoft.com/bash/tip\_colors\_and\_formatting">это</a> хорошая ссылка.</p>

<p>перед тем, как вывести любой цвет, убедитесь, что вы находитесь в терминале:</p><pre><code>[ -t 1 ] && echo 'yes i am in a terminal' # isatty(3) call in c </code></pre><p>затем вам нужно проверить работоспособность терминала, если он поддерживает цвет</p><p>в системах с <code>terminfo</code> <em>(на основе linux)</em> количество поддерживаемых цветов можно получить как</p><pre><code>number\_of\_colors\_supported=$(tput colors) в системах с termcap (на основе bsd) количество поддерживаемых цветов можно получить какnumber_of_colors_supported=$(tput co) </code></pre><p>тогда примите решение:</p><pre><code>[ ${number_of_colors_supported} -ge 8 ] && { echo 'you are fine and can print colors' } || { echo 'terminal does not support color' } кстати, не используйте раскраски, как это было предложено ранее с символами esc. используйте стандартный вызов терминала, который назначит вам правильные цвета, которые поддерживает конкретный терминал.fg_black="$(tput af 0)" fg\_red="$(tput af 1)" fg_green="$(tput af 2)" fg\_yellow="$(tput af 3)" fg_blue="$(tput af 4)" fg\_magenta="$(tput af 5)" fg_cyan="$(tput af 6)" fg\_white="$(tput af 7)" reset="$(tput me)" </code></pre><pre><code>fg\_black="$(tput setaf 0)" fg_red="$(tput setaf 1)" fg\_green="$(tput setaf 2)" fg_yellow="$(tput setaf 3)" fg\_blue="$(tput setaf 4)" fg_magenta="$(tput setaf 5)" fg\_cyan="$(tput setaf 6)" fg_white="$(tput setaf 7)" reset="$(tput sgr0)" echo -e "${fg\_red} red ${fg_green} bull ${reset}" </code></pre>

<p>как уже говорили другие, вы можете использовать escape-символы. вы можете использовать <a href="https://github.com/gon1332/fort320/blob/master/include/utils/colors.h">мой заголовок</a> , чтобы сделать это проще:</p><pre><code>#ifndef \_colors\_ #define \_colors\_ /* foreground */ #define rst "\x1b[0m" #define kred "\x1b[31m" #define kgrn "\x1b[32m" #define kyel "\x1b[33m" #define kblu "\x1b[34m" #define kmag "\x1b[35m" #define kcyn "\x1b[36m" #define kwht "\x1b[37m" #define fred(x) kred x rst #define fgrn(x) kgrn x rst #define fyel(x) kyel x rst #define fblu(x) kblu x rst #define fmag(x) kmag x rst #define fcyn(x) kcyn x rst #define fwht(x) kwht x rst #define bold(x) "\x1b[1m" x rst #define undl(x) "\x1b[4m" x rst #endif /* \_colors\_ */ </code></pre><p>примером использования макросов заголовка может быть:</p><pre><code>#include <iostream> #include "colors.h" using namespace std; int main() { cout << fblu("i'm blue.") << endl; cout << bold(fblu("i'm blue-bold.")) << endl; return 0; } </code></pre><p><img src="https://i.stack.imgur.com/g8ikc.png" alt="enter image description here"></p>

<p>я использую следующее решение, оно довольно простое и элегантное, может быть легко вставлено в исходный код и работает в linux/bash:</p><pre><code>const std::string red("\033[0;31m"); const std::string green("\033[1;32m"); const std::string yellow("\033[1;33m"); const std::string cyan("\033[0;36m"); const std::string magenta("\033[0;35m"); const std::string reset("\033[0m"); std::cout << "measured runtime: " << yellow << timer.count() << reset << std::endl; </code></pre>

<p>это старая тема, но я написал класс с вложенными подклассами и статическими членами для цветов, определенных простыми макросами си.</p><p>я получил функцию <code>color</code> из этого поста <a href="http://www.dreamincode.net/forums/topic/59656-color-text-in-c-programming/page\_\_view\_\_findpost\_\_p\_\_394955?s=fc8c28801cd197bf8cf5cefb44257f97">color text in c programming</a> в dreamincode.net от пользователя no2pencil.</p><p>я сделал это таким образом, чтобы иметь возможность использовать статические константы в потоке std :: cout следующим образом:</p><pre><code>cout << zkr::cc::fore::red << "this is red text. " << zkr::cc::console << "and changing to console default colors, fg, bg." << endl; </code></pre><p>класс и исходный код тестовой программы можно скачать <a href="http://wiznet.gr/src/ccolor.zip">здесь</a> .</p><p><code>cc::console</code> вернется к консольным цветам и атрибутам по умолчанию, <code>cc::underline</code> подчеркнет текст, который работает на putty, который я тестировал в тестовой программе.</p><p>цвета:</p><pre><code>black blue red magenta green cyan yellow white lightblack lightblue lightred lightmagenta lightgreen lightcyan lightyellow lightwhite </code></pre><p>который может использоваться со статическими подклассами <code>fore</code> и <code>back</code> статического класса <code>cc</code>.</p><p><strong> редактировать 2017 </strong></p><p>я просто добавляю код класса здесь, чтобы быть более практичным.</p><p>макросы цветового кода:</p><pre><code>#define cc\_console\_color\_default "\033[0m" #define cc\_forecolor(c) "\033[" #c "m" #define cc\_backcolor(c) "\033[" #c "m" #define cc\_attr(a) "\033[" #a "m" </code></pre><p>и основная функция цвета, которая определяет цвет или атрибут экрана:</p><pre><code>char *cc::color(int attr, int fg, int bg) { static char command[13]; /* command is the control command to the terminal */ sprintf(command, "%c[%d;%d;%dm", 0x1b, attr, fg + 30, bg + 40); return command; } </code></pre><p><strong> ccolor.h </strong></p><pre><code>#include <stdio.h> #define cc\_console\_color\_default "\033[0m" #define cc\_forecolor(c) "\033[" #c "m" #define cc\_backcolor(c) "\033[" #c "m" #define cc\_attr(a) "\033[" #a "m" namespace zkr { class cc { public: class fore { public: static const char *black; static const char *blue; static const char *red; static const char *magenta; static const char *green; static const char *cyan; static const char *yellow; static const char *white; static const char *console; static const char *lightblack; static const char *lightblue; static const char *lightred; static const char *lightmagenta; static const char *lightgreen; static const char *lightcyan; static const char *lightyellow; static const char *lightwhite; }; class back { public: static const char *black; static const char *blue; static const char *red; static const char *magenta; static const char *green; static const char *cyan; static const char *yellow; static const char *white; static const char *console; static const char *lightblack; static const char *lightblue; static const char *lightred; static const char *lightmagenta; static const char *lightgreen; static const char *lightcyan; static const char *lightyellow; static const char *lightwhite; }; static char *color(int attr, int fg, int bg); static const char *console; static const char *underline; static const char *bold; }; } </code></pre><p><strong> ccolor.cpp </strong></p><pre><code>#include "ccolor.h" using namespace std; namespace zkr { enum color { black, red, green, yellow, blue, magenta, cyan, white, default = 9 }; enum attributes { reset, bright, dim, underline, blink, reverse, hidden }; char *cc::color(int attr, int fg, int bg) { static char command[13]; /* command is the control command to the terminal */ sprintf(command, "%c[%d;%d;%dm", 0x1b, attr, fg + 30, bg + 40); return command; } const char *cc::console = cc\_console\_color\_default; const char *cc::underline = cc\_attr(4); const char *cc::bold = cc\_attr(1); const char *cc::fore::black = cc\_forecolor(30); const char *cc::fore::blue = cc\_forecolor(34); const char *cc::fore::red = cc\_forecolor(31); const char *cc::fore::magenta = cc\_forecolor(35); const char *cc::fore::green = cc\_forecolor(92); const char *cc::fore::cyan = cc\_forecolor(36); const char *cc::fore::yellow = cc\_forecolor(33); const char *cc::fore::white = cc\_forecolor(37); const char *cc::fore::console = cc\_forecolor(39); const char *cc::fore::lightblack = cc\_forecolor(90); const char *cc::fore::lightblue = cc\_forecolor(94); const char *cc::fore::lightred = cc\_forecolor(91); const char *cc::fore::lightmagenta = cc\_forecolor(95); const char *cc::fore::lightgreen = cc\_forecolor(92); const char *cc::fore::lightcyan = cc\_forecolor(96); const char *cc::fore::lightyellow = cc\_forecolor(93); const char *cc::fore::lightwhite = cc\_forecolor(97); const char *cc::back::black = cc\_backcolor(40); const char *cc::back::blue = cc\_backcolor(44); const char *cc::back::red = cc\_backcolor(41); const char *cc::back::magenta = cc\_backcolor(45); const char *cc::back::green = cc\_backcolor(42); const char *cc::back::cyan = cc\_backcolor(46); const char *cc::back::yellow = cc\_backcolor(43); const char *cc::back::white = cc\_backcolor(47); const char *cc::back::console = cc\_backcolor(49); const char *cc::back::lightblack = cc\_backcolor(100); const char *cc::back::lightblue = cc\_backcolor(104); const char *cc::back::lightred = cc\_backcolor(101); const char *cc::back::lightmagenta = cc\_backcolor(105); const char *cc::back::lightgreen = cc\_backcolor(102); const char *cc::back::lightcyan = cc\_backcolor(106); const char *cc::back::lightyellow = cc\_backcolor(103); const char *cc::back::lightwhite = cc\_backcolor(107); } </code></pre>

<p>вы можете использовать escape-последовательности, если ваш терминал поддерживает это. например:</p><pre><code>echo \[\033[32m\]hello, \[\033[36m\]colourful \[\033[33mworld!\033[0m\] </code></pre>

<p>насколько я понимаю, типичный цветовой код ansi</p><pre><code>"\033[{format\_attribute};{forground\_color};{background\_color}m{text}\033[{reset\_formate\_attribute}m" </code></pre><p>состоит из (имя и кодек)</p><ul> <li> <p>формат атрибут</p> <pre><code>{ "default", "0" }, { "bold", "1" }, { "dim", "2" }, { "underlined", "3" }, { "blink", "5" }, { "reverse", "7" }, { "hidden", "8" } </code></pre></li> <li> <p>цвет загрузки</p> <pre><code>{ "default", "39" }, { "black", "30" }, { "red", "31" }, { "green", "32" }, { "yellow", "33" }, { "blue", "34" }, { "magenta", "35" }, { "cyan", "36" }, { "light gray", "37" }, { "dark gray", "90" }, { "light red", "91" }, { "light green", "92" }, { "light yellow", "93" }, { "light blue", "94" }, { "light magenta", "95" }, { "light cyan", "96" }, { "white", "97" } </code></pre></li> <li> <p>фоновый цвет</p> <pre><code>{ "default", "49" }, { "black", "40" }, { "red", "41" }, { "green", "42" }, { "yellow", "43" }, { "blue", "44" }, { "megenta", "45" }, { "cyan", "46" }, { "light gray", "47" }, { "dark gray", "100" }, { "light red", "101" }, { "light green", "102" }, { "light yellow", "103" }, { "light blue", "104" }, { "light magenta", "105" }, { "light cyan", "106" }, { "white", "107" } </code></pre></li> <li> <p>текст</p> </li> <li> <p>сброс формата атрибут</p> <pre><code>{ "all", "0" }, { "bold", "21" }, { "dim", "22" }, { "underlined", "24" }, { "blink", "25" }, { "reverse", "27" }, { "hidden", "28" } </code></pre></li> </ul><p>с помощью этой информации легко раскрасить строку "я банан!" с передним цветом "желтый" и фоновым цветом "зеленый", как это</p><pre><code>"\033[0;33;42mi am a banana!\033[0m" </code></pre><p>или с библиотекой c++ <a href="https://github.com/fengwang/colorize">colorize</a> </p><pre><code>auto const& colorized\_text = color::rize( "i am a banana!", "yellow", "green" ); std::cout << colorized\_text << std::endl; </code></pre><p>больше примеров с format attribute здесь <a href="https://i.stack.imgur.com/lb6vq.png"><img src="https://i.stack.imgur.com/lb6vq.png" alt="enter image description here"></a> </p>

<p>расширенная версия заголовка gon1332:</p><pre><code>// // colors.h // // posted by gon1332 may 15 2015 on stackoverflow // https://stackoverflow.com/questions/2616906/how-do-i-output-coloured-text-to-a-linux-terminal#2616912 // // description: an easy header file to make colored text output to terminal second nature. // modified by shades aug. 14 2018 // please carefully read comments before using this tool, this will save you a lot of bugs that are going to be just about impossible to find. #ifndef colors\_h #define colors\_h /* foreground */ // these codes set the actual text to the specified color #define resettext "\x1b[0m" // set all colors back to normal. #define foreblk "\x1b[30m" // black #define forered "\x1b[31m" // red #define foregrn "\x1b[32m" // green #define foreyel "\x1b[33m" // yellow #define foreblu "\x1b[34m" // blue #define foremag "\x1b[35m" // magenta #define forecyn "\x1b[36m" // cyan #define forewht "\x1b[37m" // white /* background */ // these codes set the background color behind the text. #define backblk "\x1b[40m" #define backred "\x1b[41m" #define backgrn "\x1b[42m" #define backyel "\x1b[43m" #define backblu "\x1b[44m" #define backmag "\x1b[45m" #define backcyn "\x1b[46m" #define backwht "\x1b[47m" // these will set the text color and then set it back to normal afterwards. #define blk(x) foreblk x resettext #define red(x) forered x resettext #define grn(x) foregrn x resettext #define yel(x) foreyel x resettext #define blu(x) foreblu x resettext #define mag(x) foremag x resettext #define cyn(x) forecyn x resettext #define wht(x) forewht x resettext // example usage: cout << blu("this text's color is now blue!") << endl; // these will set the text's background color then reset it back. #define backblk(x) backblk x resettext #define backred(x) backred x resettext #define backgrn(x) backgrn x resettext #define backyel(x) backyel x resettext #define backblu(x) backblu x resettext #define backmag(x) backmag x resettext #define backcyn(x) backcyn x resettext #define backwht(x) backwht x resettext // example usage: cout << backred(foreblu("i am blue text on a red background!")) << endl; // these functions will set the background to the specified color indefinitely. // note: these do not call resettext afterwards. thus, they will set the background color indefinitely until the user executes cout << resettext // or if a function is used that calles resettext i.e. cout << red("hello world!") will reset the background color since it calls resettext. // to set text color indefinitely, see setfore functions below. #define setbackblk backblk #define setbackred backred #define setbackgrn backgrn #define setbackyel backyel #define setbackblu backblu #define setbackmag backmag #define setbackcyn backcyn #define setbackwht backwht // example usage: cout << setbackred << "this text's background and all text after it will be red until resettext is called in some way" << endl; // these functions will set the text color until resettext is called. (see above comments) #define setforeblk foreblk #define setforered forered #define setforegrn foregrn #define setforeyel foreyel #define setforeblu foreblu #define setforemag foremag #define setforecyn forecyn #define setforewht forewht // example usage: cout << setforered << "this text and all text after it will be red until resettext is called in some way" << endl; #define bold(x) "\x1b[1m" x resettext // embolden text then reset it. #define bright(x) "\x1b[1m" x resettext // brighten text then reset it. (same as bold but is available for program clarity) #define undl(x) "\x1b[4m" x resettext // underline text then reset it. // example usage: cout << bold(blu("i am bold blue text!")) << endl; // these functions will embolden or underline text indefinitely until resettext is called in some way. #define setbold "\x1b[1m" // embolden text indefinitely. #define setbright "\x1b[1m" // brighten text indefinitely. (same as bold but is available for program clarity) #define setundl "\x1b[4m" // underline text indefinitely. // example usage: cout << setbold << "i and all text after me will be bold/bright until resettext is called in some way!" << endl; #endif /* colors\_h */ </code></pre><p>как вы можете видеть, он имеет больше возможностей, таких как возможность устанавливать цвет фона временно, на неопределенный срок и другие функции. я также считаю, что это немного более удобно для начинающих и легче запомнить все функции.</p><pre><code>#include <iostream> #include "colors.h" int main() { std::cout << setbackblu << setforered << endl; std::cout << "i am red text on a blue background! :) " << endl; return 0; } </code></pre><p>просто включите файл заголовка в свой проект, и вы готовы к работе с цветным терминалом.</p>

<p>вы можете использовать цветовые коды ansi.</p><p>используйте эти функции.</p><pre><code>enum c\_color{black=30,red=31,green=32,yellow=33,blue=34,magenta=35,cyan=36,white=37}; enum c\_decoration{normal=0,bold=1,faint=2,italic=3,underline=4,riverced=26,framed=51}; void pr(const string str,c\_color color,c\_decoration decoration=c\_decoration::normal){ cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m"; } void prl(const string str,c\_color color,c\_decoration decoration=c\_decoration::normal){ cout<<"\033["<<decoration<<";"<<color<<"m"<<str<<"\033[0m"<<endl; } </code></pre>

<p>попробуйте мой заголовок здесь для быстрого и простого способа раскрасить текст: <a href="https://github.com/uduse/escape-sequence-color-header">цветовой заголовок аеди</a> </p><p><br></p><h1>бегство-sequence-color-заголовок</h1><p>раскрась свой вывод в unix, используя c++ !!</p><p><br></p><h2>параметры текстовых атрибутов:</h2><pre><code>attributes\_off, bold, underscore, blink, reverse\_video, concealed </code></pre><p><br></p><h2>варианты цвета:</h2><pre><code>black, red, green, yellow, blue, magenta, cyan, white </code></pre><p><br></p><h2>формат:</h2><p>общий формат, включите нужное значение в переменную $ $</p><pre><code>color\_$foreground_color$\_$background_color$ color\_$text_attribute$\_$foreground_color$\_$background_color$ color\_normal // to set color to default </code></pre><p>например.</p><pre><code>color\_blue\_black // leave text attribute blank if no text attribute appied color\_underscore\_yellow\_red color\_normal </code></pre><p><br></p><h2>использование:</h2><p>просто используйте, чтобы передать нужный цвет перед выводом текста, и снова используйте, чтобы установить цвет на нормальный после вывода текста.</p><pre><code>cout << color\_blue\_black << "text" << color\_normal << endl; cout << color\_bold\_yellow\_cyan << "text" << color\_normal << endl; </code></pre>

<p>лучше всего использовать библиотеку ncurses - хотя это может быть кувалдой, чтобы сломать орех, если вы просто хотите вывести простую цветную строку</p>

<p>в osx shell это работает для меня (включая 2 пробела перед "красным текстом"):</p><pre><code>$ printf "e[033;31m red textn" $ echo "$(tput setaf 1) red text" </code></pre>