PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash, Farbcodierung entfernen


_CaBaL_
2011-03-01, 12:47:44
Ich hab ein kleines Problem beim Scripten.

Aktuell nutze ich für jede Ausgabe von Daten eine Funktion



function echoCmd
{
# ---------------------------------------------------------
# minimize output if --quiet is used
# ---------------------------------------------------------

if ! ${QUIET}; then
echo -e "${1}" "${2}" | tee -a ${LOGFILE}
else
echo -e "${1}" "${2}" >> ${LOGFILE}
fi
}


Ist QUIET gesetzt wird die Ausgabe direkt ins Log geschrieben und taucht nicht mehr auf, ganz praktisch für Batch Sachen etc. Jetzt hab ich aber Folgendes Problem. Fürs Auge habe ich die Ausgabe hier und da farbig gestaltet, die Farbcodes werden aber auch in die Logdatei übernommen.


echoCmd "\033[31mERROR\033[0m, see ${LOGFILE} for further info.\n"


Ist dann in der Konsole:
ERROR, see /var/log/setup.log for further info.

Im Logfile aber so

ESC[32mERRORESC[0m, see /var/log/setup.log for further info.

Gibts da irgendeinen Workaround oder eine Funktion, wo ich die Sachen noch einmal durchjagen kann bevor die ins Log gehen?

Gnafoo
2011-03-01, 14:13:38
Hm eventuell kannst du die Escape-Sequenzen mit sed und einem regulären Ausdruck entfernen?


echo -e "\033[31mrot1\033[0m normal1 \033[31mrot2\033[0m normal2" | sed -e "s/\x1b\[[^m]\+m//g"


Erklärung:
s/…/…/g = substituiere alle Vorkommnise von … durch …
\x1b\[ = matche das \033[
[^m]\+ = matche 1-n zeichen ungleich 'm'
m = matche m

_CaBaL_
2011-03-01, 15:39:31
Das ist die Lösung die ich vermeiden wollte :D

Ich dachte da gibts vielleicht irgendeinen Trick bei Tee, oder eine sonstige Bash Funktion die sowas schon integriert hat.

Gnafoo
2011-03-01, 22:21:54
Ich bin kein Bash-Profi, aber tee bekommt doch über stdin bereits die Escape-Sequenzen mit und könnte die auch bestenfalls rausfiltern. Klar der reguläre Ausdruck ist nicht das nonplusultra, sollte den Job aber erledigen. Zumindest solange du nicht irgendwo einmal tatsächlich so eine Sequenz ausgeben willst.

Ansonsten kannst du das Problem vermutlich nur an der Wurzel packen und die Escape-Sequenzen einfach nicht erzeugen, wenn du die Ausgabe in eine Log-Datei schreibst. Da die Ausgabe im selben Skript erzeugt und ins Log geschrieben wird (zumindest in deinem Beispiel), hast du das im Prinzip in der Hand. Die Frage ist bloß, wie man die echoCmd-Funktion so gestalten kann, dass sie bequem beide Zeichenfolgen (mit und ohne Farben) erzeugen kann.

Wenn es darum geht, dass andere Skripte aufgerufen werden und ungewünschte Escape-Sequenzen ausgeben, dann hilft dir eventuell das hier weiter:
http://stackoverflow.com/questions/911168/detect-if-shell-script-is-running-through-a-pipe

_CaBaL_
2011-03-02, 09:30:48
Naja die Alternative wäre eine seperate echoCmd Funktion in der die Farben erst gesetzt werden.

Oder eine Prüfung in der Funktion ob ERROR oder OK auftaucht und diese dann dort erst farblich gestalten. Ich glaube diesen Ansatz werde ich mal verfolgen, damit umgehe ich auch, dass die die Farben in den jeweiligen Ausgaben jedesmal neu angegeben werden müssen.

Danke für die Tipps :)