387 Stimmen

Wie kann ich farbigen Text auf einem Linux-Terminal ausgeben?

Wie drucke ich farbige Zeichen auf einem Linux-Terminal, das dies unterstützt?

Wie kann ich feststellen, ob das Terminal Farbcodes unterstützt?

556voto

Thomas Punkte 160390

Sie müssen Folgendes ausgeben ANSI-Farbcodes . Beachten Sie, dass nicht alle Terminals dies unterstützen; wenn Farbsequenzen nicht unterstützt werden, erscheint Müll.

Beispiel:

 cout << "\033[1;31mbold red text\033[0m\n";

Hier, \033 ist das ESC-Zeichen, ASCII 27. Es wird gefolgt von [ , dann null oder mehr Zahlen, getrennt durch ; und schließlich das Schreiben m . Die Zahlen beschreiben die Farbe und das Format, zu dem ab diesem Zeitpunkt gewechselt wird.

Die Codes für Vorder- und Hintergrundfarben sind:

         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

Zusätzlich können Sie diese verwenden:

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

Siehe die Tabelle auf Wikipedia für andere, weniger häufig unterstützte Codes.


Um festzustellen, ob Ihr Terminal Farbsequenzen unterstützt, lesen Sie den Wert des Parameters TERM Umgebungsvariable. Sie sollte den verwendeten Terminaltyp angeben (z. B. vt100 , gnome-terminal , xterm , screen , ...). Schauen Sie dann in der Terminfo-Datenbank ; überprüfen Sie die colors Fähigkeit.

122voto

Joel Sjögren Punkte 1910

Grundlagen

Ich habe eine C++-Klasse geschrieben, mit der man die Vorder- und Hintergrundfarbe der Ausgabe einstellen kann. Dieses Beispielprogramm dient als Beispiel für das Drucken This ->word<- is red. und formatiert es so, dass die Vordergrundfarbe von word ist rot.

#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;
}

Quelle

#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";
        }
    };
}

Avancé

Möglicherweise möchten Sie der Klasse zusätzliche Funktionen hinzufügen. So ist es zum Beispiel möglich, die Farbe Magenta und sogar Stile wie Fettschrift . Dazu müssen Sie lediglich einen weiteren Eintrag in der Code Aufzählung. Diese ist eine gute Referenz.

47voto

Alex Punkte 755

Bevor Sie eine Farbe ausgeben, müssen Sie sicherstellen, dass Sie sich in einem Terminal befinden:

[ -t 1 ] && echo 'Yes I am in a terminal'  # isatty(3) call in C

Dann müssen Sie prüfen, ob das Terminal Farbe unterstützt.

auf Systemen mit terminfo (Linux-basiert) können Sie die Anzahl der unterstützten Farben erhalten als

Number_Of_colors_Supported=$(tput colors)

auf Systemen mit termcap (BSD-basiert) können Sie die Anzahl der unterstützten Farben erhalten als

Number_Of_colors_Supported=$(tput Co)

Dann treffen Sie Ihre Entscheidung:

[ ${Number_Of_colors_Supported} -ge 8 ] && {
    echo 'You are fine and can print colors'
} || {
    echo 'Terminal does not support color'
}

Übrigens, verwenden Sie keine Farbgebung, wie es zuvor mit ESC-Zeichen vorgeschlagen wurde. Verwenden Sie den Standardaufruf an das Terminal, der Ihnen die korrekten Farben zuweist, die das jeweilige Terminal unterstützt.

BSD-basiert

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)"

Linux-basiert

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)"

Verwendung als

echo -e "${fg_red}  Red  ${fg_green} Bull ${reset}"

45voto

gon1332 Punkte 1780

Wie andere bereits erwähnt haben, können Sie Escape-Zeichen verwenden. Sie können verwenden meine Überschrift um es einfacher zu machen:

#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_ */

Ein Beispiel mit den Makros der Kopfzeile könnte sein:

#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;
}

enter image description here

39voto

Feng Wang Punkte 1318

Nach meinem Verständnis ist ein typischer ANSI-Farbcode

"\033[{FORMAT_ATTRIBUTE};{FORGROUND_COLOR};{BACKGROUND_COLOR}m{TEXT}\033[{RESET_FORMATE_ATTRIBUTE}m"

besteht aus (Name und Codec)

  • FORMATATTRIBUT

     { "Default", "0" },
     { "Bold", "1" },
     { "Dim", "2" },
     { "Italics", "3"},
     { "Underlined", "4" },
     { "Blink", "5" },
     { "Reverse", "7" },
     { "Hidden", "8" }
  • VORDERGRUNDFARBE

     { "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" }
  • HINTERGRUNDFARBE

     { "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" }
  • TEXT

  • FORMATATTRIBUT ZURÜCKSETZEN

     { "All", "0" },
     { "Bold", "21" },
     { "Dim", "22" },
     { "Underlined", "24" },
     { "Blink", "25" },
     { "Reverse", "27" },
     { "Hidden", "28" }

Mit diesen Informationen ist es einfach, eine Zeichenkette "Ich bin eine Banane!" mit der Vordergrundfarbe "Gelb" und der Hintergrundfarbe "Grün" wie folgt einzufärben

"\033[0;33;42mI am a Banana!\033[0m"

Oder mit einer C++-Bibliothek Einfärben

auto const& colorized_text = color::rize( "I am a banana!", "Yellow", "Green" );
std::cout << colorized_text << std::endl;

Weitere Beispiele mit FORMAT ATTRIBUTE hier enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X