Bash: Farben im Terminal ausgeben

Wie du Farben im Bash-Terminal sauber ausgibst und worauf du bei Escape-Sequenzen achten solltest.

Dieser Artikel hat eine Lesedauer von 3 minutes Minuten.

Bash: Farben im Terminal ausgeben

Farbiger Output macht Bash-Skripte besser lesbar, wenn du es sparsam und sauber einsetzt. Entscheidend ist der Reset am Ende und ein Ansatz, der auf macOS und Linux stabil funktioniert.

Schritt 0: Was echo kann und warum printf meist die bessere Basis ist

Viele Beispiele im Netz nutzen echo -e, um Escape-Sequenzen wie \033 zu interpretieren. Das funktioniert häufig, ist aber nicht überall gleich zuverlässig, weil echo je nach Shell und System leicht unterschiedlich implementiert ist.

Für reproduzierbare Skripte ist printf die solidere Wahl. Es interpretiert Escape-Sequenzen konsistent und formatiert sauber.

ANSI Escape Codes: der kleinste gemeinsame Nenner

Die meisten Terminals unterstützen ANSI Escape Codes. Du kombinierst dabei:

  • Startsequenz, die eine Farbe setzt
  • Text
  • Resetsequenz, die wieder auf Standard zurückstellt

Ein minimaler Einstieg mit printf:

printf "___JEKYLL_MINIFY_HTML_BLOCK_3___33[31mRot___JEKYLL_MINIFY_HTML_BLOCK_3___33[0m\n"

Dabei gilt:

  • \033 ist das Escape-Zeichen
  • [31m setzt die Vordergrundfarbe auf Rot
  • [0m setzt alles zurück

Wenn du den Reset vergisst, bleibt dein Terminal nach dem Skript im Farbschema hängen. Genau das ist der häufigste Fehler.

Praktisches Muster: Farben als Variablen definieren

Im Skript-Alltag willst du nicht überall Codes wiederholen. Definiere sie einmal und nutze sie dann wie Bausteine.

RED="___JEKYLL_MINIFY_HTML_BLOCK_4___33[31m"
GREEN="___JEKYLL_MINIFY_HTML_BLOCK_4___33[32m"
YELLOW="___JEKYLL_MINIFY_HTML_BLOCK_4___33[33m"
RESET="___JEKYLL_MINIFY_HTML_BLOCK_4___33[0m"

printf "${GREEN}OK${RESET} Build erfolgreich\n"
printf "${YELLOW}WARN${RESET} Konfiguration fehlt, nutze Defaults\n"
printf "${RED}ERR${RESET} Konnte Datei nicht öffnen\n"

Das ist schlicht, gut lesbar und schnell angepasst.

Hintergrundfarben und Styles

Neben Vordergrundfarben kannst du auch Hintergrundfarben und Styles setzen:

  • Bold: 1
  • Underline: 4
  • Hintergrundfarben beginnen meist bei 40 bis 47

Beispiel: Weißer Text auf rotem Hintergrund, fett, danach Reset:

printf "___JEKYLL_MINIFY_HTML_BLOCK_5___33[1;37;41mFATAL___JEKYLL_MINIFY_HTML_BLOCK_5___33[0m Etwas ist schiefgelaufen\n"

Wenn du Styles kombinierst, trennst du die Codes mit Semikolon.

echo in Farbe: wenn du es trotzdem verwenden willst

Wenn du bewusst bei echo bleiben willst, brauchst du typischerweise -e, damit Escape-Sequenzen interpretiert werden.

echo -e "___JEKYLL_MINIFY_HTML_BLOCK_6___33[34mBlau___JEKYLL_MINIFY_HTML_BLOCK_6___33[0m"

Das kann funktionieren, aber es ist weniger verlässlich als printf. Für Skripte, die du teilst oder in CI laufen lässt, ist printf meist die bessere Default-Entscheidung.

Nutzerfreundlich: Status-Helper statt bunter Texte überall

Farben sind am hilfreichsten bei Statusmeldungen. Ein kleines Helper-Pattern hält den Code sauber und reduziert Wiederholungen.

RED="___JEKYLL_MINIFY_HTML_BLOCK_7___33[31m"
GREEN="___JEKYLL_MINIFY_HTML_BLOCK_7___33[32m"
YELLOW="___JEKYLL_MINIFY_HTML_BLOCK_7___33[33m"
RESET="___JEKYLL_MINIFY_HTML_BLOCK_7___33[0m"

log_ok()   { printf "${GREEN}OK${RESET} %s\n" "$1"; }
log_warn() { printf "${YELLOW}WARN${RESET} %s\n" "$1"; }
log_err()  { printf "${RED}ERR${RESET} %s\n" "$1" >&2; }

log_ok "Alles bereit"
log_warn "Kein Cache gefunden"
log_err "Download fehlgeschlagen"

Zwei Details sind hier bewusst:

  • Fehler gehen nach stderr über >&2
  • der Text wird als %s formatiert, dadurch bleibt Quoting sauber

Optional, aber sinnvoll: Farben automatisch deaktivieren

Nicht jedes Umfeld kann Farben. Logs in Dateien, manche CI-Ausgaben oder Tools, die Output weiterverarbeiten, profitieren von “no color”.

Ein pragmatisches Muster ist ein Flag oder eine einfache Umgebungsvariable:

NO_COLOR="${NO_COLOR:-}"

if [[ -n "$NO_COLOR" ]]; then
  RED=""
  GREEN=""
  YELLOW=""
  RESET=""
else
  RED="___JEKYLL_MINIFY_HTML_BLOCK_8___33[31m"
  GREEN="___JEKYLL_MINIFY_HTML_BLOCK_8___33[32m"
  YELLOW="___JEKYLL_MINIFY_HTML_BLOCK_8___33[33m"
  RESET="___JEKYLL_MINIFY_HTML_BLOCK_8___33[0m"
fi

Damit kannst du Farben per NO_COLOR=1 ./script.sh abschalten, ohne den Code umzubauen.

Mini-Skript: farbige Ausgabe als Grundlage für eigene Tools

#!/usr/bin/env bash
set -u

NO_COLOR="${NO_COLOR:-}"

if [[ -n "$NO_COLOR" ]]; then
  RED=""
  GREEN=""
  YELLOW=""
  RESET=""
else
  RED="___JEKYLL_MINIFY_HTML_BLOCK_9___33[31m"
  GREEN="___JEKYLL_MINIFY_HTML_BLOCK_9___33[32m"
  YELLOW="___JEKYLL_MINIFY_HTML_BLOCK_9___33[33m"
  RESET="___JEKYLL_MINIFY_HTML_BLOCK_9___33[0m"
fi

log_ok()   { printf "${GREEN}OK${RESET} %s\n" "$1"; }
log_warn() { printf "${YELLOW}WARN${RESET} %s\n" "$1"; }
log_err()  { printf "${RED}ERR${RESET} %s\n" "$1" >&2; }

log_ok "Start"
log_warn "Das ist nur ein Hinweis"
log_err "Das ist ein Fehler"

Aufruf:

./colors.sh
NO_COLOR=1 ./colors.sh

Cheatsheet

ZweckNameCodeBeispiel
ResetReset0\033[0m
StyleBold1\033[1m
StyleDim2\033[2m
StyleUnderline4\033[4m
StyleBlink (selten)5\033[5m
StyleReverse7\033[7m
StyleHidden8\033[8m
VordergrundSchwarz30\033[30m
VordergrundRot31\033[31m
VordergrundGrün32\033[32m
VordergrundGelb33\033[33m
VordergrundBlau34\033[34m
VordergrundMagenta35\033[35m
VordergrundCyan36\033[36m
VordergrundWeiß37\033[37m
Vordergrund (hell)Hellgrau90\033[90m
Vordergrund (hell)Hellrot91\033[91m
Vordergrund (hell)Hellgrün92\033[92m
Vordergrund (hell)Hellgelb93\033[93m
Vordergrund (hell)Hellblau94\033[94m
Vordergrund (hell)Hellmagenta95\033[95m
Vordergrund (hell)Hellcyan96\033[96m
Vordergrund (hell)Hellweiß97\033[97m
HintergrundSchwarz40\033[40m
HintergrundRot41\033[41m
HintergrundGrün42\033[42m
HintergrundGelb43\033[43m
HintergrundBlau44\033[44m
HintergrundMagenta45\033[45m
HintergrundCyan46\033[46m
HintergrundWeiß47\033[47m
Hintergrund (hell)Hellschwarz/Grau100\033[100m
Hintergrund (hell)Hellrot101\033[101m
Hintergrund (hell)Hellgrün102\033[102m
Hintergrund (hell)Hellgelb103\033[103m
Hintergrund (hell)Hellblau104\033[104m
Hintergrund (hell)Hellmagenta105\033[105m
Hintergrund (hell)Hellcyan106\033[106m
Hintergrund (hell)Hellweiß107\033[107m

Kurzfazit

Farbiger Output in Bash ist im Kern nur ANSI plus Reset. Wenn du stabile Skripte willst, nutze printf statt echo -e, definiere Farben als Variablen und kapsle Statusausgaben in kleine Helper-Funktionen. So bleibt es lesbar und du vermeidest den Klassiker, das Terminal dauerhaft einzufärben.

🤫 Pssst: Du möchtest lernen, wie Bash funktioniert? Dann schau dir doch mein Bash-Tutorial für Anfänger an.

Interesse an einer Zusammenarbeit?


Ob konkrete Anfrage, lose Idee oder erster Austausch: Schreib mir, wenn du denkst, dass wir gut zusammenpassen könnten.



ein iPhone welches einen Anruf von Oliver Jessner zeigt.