2016-05-09 26 views
6

Aus irgendeinem Grund mein Shell-Skript beendet, mein Menü in Farbe zu drucken und tatsächlich den literalen Farbcode stattdessen druckt. Ist mir die Farbkodierung irgendwie entgangen?Bash Drucken Farbcodes wörtlich und nicht in der tatsächlichen Farbe

Script

#!/bin/bash 

function showEnvironments { 
echo -e "\e[38;5;81m" 
echo -e "  SELECT ENVIRONMENT  " 
echo -e "[1] - QA" 
echo -e "[2] - PROD" 
echo -e "\e[0m" 
} 

showEnvironments 

Output

\ e [38; 5; 81m

SELECT ENVIRONMENT

[1] - Staging

[2] - QA

\ e [0m

ich iTerm auf Mac OSX und der TERM Umgebungsvariable bin mit auf xterm-256color gesetzt.

+0

Sie sollten Ihre Frage bearbeiten, um den Terminal-Emulator, den Sie verwenden, und den Inhalt der Umgebungsvariablen 'TERM' einzuschließen. –

+0

TERM = xterm-256color TERM_PROGRAM = iTerm.app Haben Sie danach gesucht? –

+0

Ja. Ich habe Ihre Frage bearbeitet, um diese wichtigen Informationen hinzuzufügen. Ich benutze keinen Mac, daher weiß ich nicht, wie iTerm konfiguriert werden müsste, um ANSI-Escape-Sequenzen korrekt zu interpretieren. –

Antwort

4

Es gibt einige offensichtliche Fehler bei der Umsetzung von echo -e in bash 3.2.x, das ist, was wird mit Mac OS X. Die Dokumentation behauptet, dass \E (nicht \e) ESC darstellt, aber weder scheint zu funktionieren. Sie können printf statt:

printf "\e[38;5;81mfoo\e[0m\n" 

oder verwenden \033 (wie Sie entdeckt) ESC zu vertreten.

Spätere Versionen von bash (definitiv 4,3, mögliche frühere 4.x-Versionen) beheben dies und erlauben entweder \e oder \E zu verwenden.

1

Zwei mögliche Dinge zu versuchen:

  • Lauf stty sane Terminaleinstellungen
  • Überprüfung der $TERM Umgebungsvariable
4

Zwei Möglichkeiten zurückgesetzt, dies zu tun: Referenzfarben direkt oder Variablen zuweisen um sie später im Skript einfacher zu referenzieren.

cNone='\033[00m' 
cRed='\033[01;31m' 
cGreen='\033[01;32m' 
cYellow='\033[01;33m' 
cPurple='\033[01;35m' 
cCyan='\033[01;36m' 
cWhite='\033[01;37m' 
cBold='\033[1m' 
cUnderline='\033[4m' 

echo -e "\033[01;31m" 
echo -e "hello" 
echo -e "\033[00m" 

echo -e "${cGreen}" 
echo -e "hello" 
echo -e "${cNone}" 

Ich hoffe, das hilft.

1

Ich fand es heraus. Es scheint, dass das Escape-Zeichen, das ich für den Farbcode verwende, in meinem Terminal nicht erkannt wird.

Basierend auf http://misc.flogisoft.com/bash/tip_colors_and_formatting#colors1 gültigen Escape-Codes sind:

\e 
\033 
\x1B 

Wenn ich von \ e meine Farben geändert [38; 5; 81m zu \ 033 [38; 5; 81m es zu arbeiten begann als erwartet.

Danke an alle anderen für die Vorschläge und Hilfe!