Cordess
Anmeldungsdatum: 14. Mai 2006
Beiträge: 466
|
Ich verwende in meinen Skripten gerne die backslash Escape Sequenzen um die Ausgabe mit Farbe etwas übersichtlicher zu gestalten.
Also bspw. so etwas:
| #!/bin/sh
echo -e "\033[1;31m Das ist roter Text, der fett ist.\033[1;33m Das ist gelber Text, der fett ist.\033[0;37m"
|
Leider wird das Skript selbst dadurch etwas unübersichtlich.
Denn ohne diese Escape Sequenzen würde es so aussehen:
| #!/bin/sh
echo "Das ist roter Text, der fett ist. Das ist gelber Text, der fett ist."
|
Man sieht deutlich, dass letzteres viel besser zu lesen ist, da gleich klar ist, was das Skript ausgeben wird und die kryptischen Escapesequenzen fehlen. Daher würde ich gerne Wissen ob es irgendeine Möglichkeit gibt beides zu vereinen?
Also die Ausgabe farbig zu gestalten, aber im Skript die Lesbarkeit des auszugebenden Textes zu erhalten. Ich selbst dachte da bspw. an so etwas: 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #!/bin/sh
gelb="echo -n \033[1;33m"
rot="echo -n \033[1;31m"
blau="echo -n \033[1;34m"
normal="echo -n \033[0;37m"
$rot
echo -n " Das ist roter Text, der fett ist."
$gelb
echo -n " Das ist gelber Text, der fett ist."
$blau
echo -n " Das war blau."
$normal
echo
|
oder eine Lösung mit einer Funktion
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #!/bin/sh
gelb="echo -n \033[1;33m"
rot="echo -n \033[1;31m"
blau="echo -n \033[1;34m"
normal="echo -n \033[0;37m"
farbig(){
echo -n $3 $4
$normal
}
farbig $blau "Das ist blauer Text "
farbig $rot "Das ist roter Text "
farbig $gelb "Das ist gelber Text "
echo ""
|
Der Nachteil ist allerdings, dass dann Ausgaben wie bspw.
| echo "Den Befehl ls kann man mit dem Parameter -l ausgeben."
|
bzw. farbig unter Vorhebung des Befehlnamens und Parameter
| echo -e "Den Befehl \033[1;31mls\033[0;37m kann man mit dem Parameter \033[1;31m-l\033[0;37m ausgeben."
|
so zerstückelt werden würden:
| echo -n "Den Befehl "
$rot
echo -n "ls "
$normal
echo -n "kann man mit dem Parameter "
$rot
echo -n "-l "
$normal
echo "ausgeben."
|
oder so:
| farbig $normal "Den Befehl "
farbig $rot "ls "
farbig $normal "kann man mit dem Parameter "
farbig $rot "-l "
echo "ausgeben."
|
Das ist irgendwie auch nicht viel besser
Außerdem schleichen sich so wiederum Fehler ein.
Man achte bspw. bei der Funktionsvariante, dass das Leerzeichen im String "-l " aus irgendeinem Grund, den ich noch nicht herausgefunden habe, nicht ausgegeben wird.
Eventuell ist es ein Bug in der Shell. Bei allen anderen Strings wird das nachhängende Leerzeichen ausgegeben. Wie man also sieht ist keine Lösung irgendwie zufriedenstellend.
Daher würde mich nun interessieren, ob ihr vielleicht noch bessere Lösungen kennt und wie ihr das macht.
Generell auf eine farbige Ausgabe verzichten, möchte ich hingegen nicht. Die ist einfach zu praktisch in der täglichen Anwendung der Skripte.
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3532
|
tput ist Dein Freund. tput bold #die schrift wird fett
tput setaf [0-8] #die schrift wird farbig
tput sgr 0 # reset
|
Cordess
(Themenstarter)
Anmeldungsdatum: 14. Mai 2006
Beiträge: 466
|
dingsbums schrieb: tput ist Dein Freund. tput bold #die schrift wird fett
tput setaf [0-8] #die schrift wird farbig
tput sgr 0 # reset
Die Variante finde ich jetzt nicht viel übersichtlicher als Variante 1.
Außerdem muss dafür ein extra Prozess gestartet werden, bei den Escapesequenzen übernimmt die Weitergabe an das Terminal direkt echo.
Bezüglich der Farben werden nur die dunklen Farben ausgegeben, wobei es da aber sicherlich eine Möglichkeit gibt, die hellen zu triggern. Das eigentliche Problem bleibt aber, es ist nicht viel übersichtlicher als Variante 1.
Auch hier hätte man einen haufen tputs zwischen dem Text bzw. würde der Text zerstückelt werden.
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3532
|
Daher würde mich nun interessieren ... wie ihr das macht.
Wie beschrieben.
Auch hier hätte man einen haufen tputs zwischen dem Text bzw. würde der Text zerstückelt werden.
Irgendwie und irgendwo wirst Du "werde farbig"-Befehle immer reinschreiben müssen. Mir wird nicht so ganz klar, was Dir eigentlich vorschwebt.
|
Cordess
(Themenstarter)
Anmeldungsdatum: 14. Mai 2006
Beiträge: 466
|
dingsbums schrieb: Irgendwie und irgendwo wirst Du "werde farbig"-Befehle immer reinschreiben müssen. Mir wird nicht so ganz klar, was Dir eigentlich vorschwebt.
Übersichtlich wäre bspw. so etwas: (Pseudocode)
| echo blue=0 normal=16 red=33 normal=37 "Dieser Satz ist blau. Und dieses Wort ist rot."
|
Da bleibt die Ausgabe schön zusammenhängend und übersichtlich. Die ausgeschriebenen Farbwerte könnte man auch so machen, dass man sie abkürzen kann.
Z.B. so
| echo c=b0 c=n15 c=r33 c=n37 "Dieser Satz ist blau. Und dieses Wort ist rot."
|
oder so:
| echo c=b0,n15,r33,n37 "Dieser Satz ist blau. Und dieses Wort ist rot."
|
Leider wäre das aber ohne Hilfsprogramme, die die Position im String anzeigen oder sogar relativ, bei einer Änderung der Stringlänge verändern, nicht besonders wartbar. Das ist wiederum der Vorteil der unübersichtlichen Escapesequenzen, die passen sich bei einer Änderung der Stringlänge an. Das Problem scheint hier wohl einfach an der fehlenden Objektorientiertheit der Shell zu liegen.
Es ist halt alles ein Textstream, es sind keine Objekte denen man Attribute geben könnte. EDIT: Vielleicht wäre es so am besten:
| echo "<blue>Dieser Satz ist blau.<normal> Und dieses Wort ist <red>rot."
|
Das wäre sehr gut lesbar und wartbar, die Pfeilklammern müssten vom echo Befehl dann aber ignoriert werden. So etwas funktioniert aber auch nicht ohne Fehler:
|
#!/bin/sh
gelb="\033[1;33m"
rot="\033[1;31m"
blau="\033[1;34m"
normal="\033[0;37m"
echo "$blueDieser Satz ist blau.$normal Und dieses Wort ist $rotrot."
|
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
Du kannst beide Ansätze kombinieren: | #!/bin/sh
red=$(tput setaf 1)
green=$(tput setaf 2)
echo "${red}This is red, ${green}and this is green."
|
tput liefert dir dabei die für das aktuelle Terminal passenden Escape-Sequenzen. Allerdings sind die nicht mehr „escaped“, sondern eben schon die rohen tatsächlichen Bytes, so wie sie ans Terminal geschickt werden müssen.
Wenn’s einfach nur Farben sein sollen, könntest du auch ohne tput davonkommen. Ich kann den Einsatz aber trotzdem nur empfehlen, weil du dich dann nicht mehr damit rumschlagen musst, die für das aktuelle Terminal passenden Sequenzen zu finden. Noch besser wäre vielleicht sogar das hier: | #!/bin/sh
if test -t 1
then
red=$(tput setaf 1)
green=$(tput setaf 2)
fi
echo "${red:-}This is red, ${green:-}and this is green."
|
Ist etwas länger, aber wenn dein STDOUT mal kein Terminal ist, dann werden keine Farbcodes mehr ausgegeben.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
Vain schrieb:
| echo "${red:-}This is red, ${green:-}and this is green."
|
Warum verwendest Du ":-"? Da die Variablen normalerweise nicht gesetzt sind, werden sie eh zu Leerstrings expandiert. Der Witz von ":-" ist ja, dass man dahinter normalerweise eine alternative Ersetzung packt, was Du hier gar nicht tust.
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
Joa. Brainfart. ☺ Probieren wir’s damit nochmal: | #!/bin/sh
unset red green
if test -t 1
then
red=$(tput setaf 1)
green=$(tput setaf 2)
fi
echo "${red}This is red, ${green}and this is green."
|
|
Cordess
(Themenstarter)
Anmeldungsdatum: 14. Mai 2006
Beiträge: 466
|
Vain schrieb: Joa. Brainfart. ☺ Probieren wir’s damit nochmal: | #!/bin/sh
unset red green
if test -t 1
then
red=$(tput setaf 1)
green=$(tput setaf 2)
fi
echo "${red}This is red, ${green}and this is green."
|
Das gefällt mir jetzt schon ausgesprochen gut, ich müsste jetzt nur noch wissen, wie man die hellen farbenvarianten der Grundfarben mit tput hinkriegt.
Das rot, blau, grün, gelb, usw. ist mit tput setaf * alles dunkel.
Bei den Escapesequenzen gibt es ein hell und dunkel zur Auswahl.
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
Vielleicht erreichst du am ehesten dein Ziel, indem du sagst: „Helle Farbe = dunkle Farbe + 8“. Guck’ dir mal zur Übersicht diese Ausgabe an: | for i in {0..255}; do tput sgr0; tput setaf $i; printf '%3d Hallo\n' $i; done
|
In einem typischen Terminal unter X11/Wayland solltest du sehen: 8 dunkle Farben 8 hellere Varianten der vorherigen dunklen Farben 6 * 6 * 6 = 216 Farben („RGB“, wobei die Errechnung des Indexes ist: „Index = 16 + 36 * int(r/51) + 6 * int(g/51) + int(b/51)“, wobei „r“, „g“ und „b“ Integer zwischen 0 und 255 sind) 24 Graustufen
Punkt 3 erklärt sich einfach so: Wenn du als Farbindex in der Kontrollsequenz intern im Terminalemulator nur Zahlen zwischen 0 und 255 zulassen willst (also ein Byte) und du bereits die 16 „Grundfarben“ hast, dann ist das der größte RGB-Würfel, den du noch zur Verfügung hast. Ich würde schätzen, dass die Mehrheit der Leute im Jahre 2018 mit einem solchen Terminal unterwegs ist. Genau, wie man eigentlich davon ausgehen kann, dass die meisten Leute ihr Terminal im UTF-8-Modus betreiben. Sicher sein kannst du aber nicht. Wenn das Terminal die Farbe nicht unterstützt, $TERM entsprechend gesetzt ist und ein passender Terminfo-Eintrag dafür existiert, dann kapiert tput wahrscheinlich, dass die gewünschte Farbe nicht geht. Vielleicht lügt $TERM auch, weil der User es blind auf sowas wie xterm-256color gesetzt hat, und dann siehst du Zeichensalat oder irgendeinen anderen Quatsch. Nach meiner Erfahrung™ hat man am wenigsten Kopfschmerzen, wenn man sagt: Ich beschränke mich auf die 8 Grundfarben. Möchte ich zusätzlich etwas hervorheben, dann verwende ich dafür Bold (oder zur Not Reverse).
Diese Features sind so weit verbreitet, das geht in aller Regel gut.
|
dingsbums
Anmeldungsdatum: 13. November 2010
Beiträge: 3532
|
Wenn Du es kompatibel haben willst, beschränke Dich auf bold und rev. Dann ist es bei jeder Terminal-Hintergrundfarbe lesbar. Gelb auf braun z.B. kommt nicht wirklich gut ☺
|
Cordess
(Themenstarter)
Anmeldungsdatum: 14. Mai 2006
Beiträge: 466
|
Vain schrieb: Vielleicht erreichst du am ehesten dein Ziel, indem du sagst: „Helle Farbe = dunkle Farbe + 8“. Guck’ dir mal zur Übersicht diese Ausgabe an: | for i in {0..255}; do tput sgr0; tput setaf $i; printf '%3d Hallo\n' $i; done
|
In einem typischen Terminal unter X11/Wayland solltest du sehen: 8 dunkle Farben 8 hellere Varianten der vorherigen dunklen Farben 6 * 6 * 6 = 216 Farben („RGB“, wobei die Errechnung des Indexes ist: „Index = 16 + 36 * int(r/51) + 6 * int(g/51) + int(b/51)“, wobei „r“, „g“ und „b“ Integer zwischen 0 und 255 sind) 24 Graustufen
Hm, in dem Konsolenprogramm unter KDE unter Kubuntu 16.04 werden nur die ersten 6 dunklen Farben (Index 1-6) angezeigt, der Rest wird in ganz normaler weißgrauer Schrift angezeigt. Siehe beigefügter Screenshot, das mit der weißgrauen Schrift geht so weiter bis runter zum Wert 255. Die 8 helleren Varianten der vorherigen dunklen Farben ist genau das was ich suche. Mit den Escapesequenzen kann man die in der KDE Konsole darstellen, nur mit tput geht es nicht. Nach meiner Erfahrung™ hat man am wenigsten Kopfschmerzen, wenn man sagt: Ich beschränke mich auf die 8 Grundfarben. Möchte ich zusätzlich etwas hervorheben, dann verwende ich dafür Bold (oder zur Not Reverse).
Diese Features sind so weit verbreitet, das geht in aller Regel gut.
Mit den Escapesequenzen gehen die helleren Varianten.
- Bilder
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
Cordess schrieb: Hm, in dem Konsolenprogramm unter KDE unter Kubuntu 16.04 werden nur die ersten 6 dunklen Farben (Index 1-6) angezeigt, der Rest wird in ganz normaler weißgrauer Schrift angezeigt. Siehe beigefügter Screenshot, das mit der weißgrauen Schrift geht so weiter bis runter zum Wert 255.
Farbe 0 ist schwarz, Farbe 7 ist Standardgrau, also die beiden siehst du auch. Sind dann die ersten 8 Stück. Dass das so mit tput nicht geht, könnte ein Indiz dafür sein, dass bei dir $TERM falsch gesetzt ist. Welchen Wert hat diese Variable? Wie gesagt, man muss sich bei diesem „einfachen“ Fall wahrscheinlich nicht auf tput versteifen. Jenachdem, was du für eine Zielgruppe hast, geht’s auch ohne.
|
Cordess
(Themenstarter)
Anmeldungsdatum: 14. Mai 2006
Beiträge: 466
|
Vain schrieb: Cordess schrieb: Hm, in dem Konsolenprogramm unter KDE unter Kubuntu 16.04 werden nur die ersten 6 dunklen Farben (Index 1-6) angezeigt, der Rest wird in ganz normaler weißgrauer Schrift angezeigt. Siehe beigefügter Screenshot, das mit der weißgrauen Schrift geht so weiter bis runter zum Wert 255.
Farbe 0 ist schwarz, Farbe 7 ist Standardgrau, also die beiden siehst du auch. Sind dann die ersten 8 Stück.
Das ist mir schon klar, ich schrieb von 6, weil Schwarz eigentlich keine Farbe ist und Standardgrau auch nicht.
Dass das so mit tput nicht geht, könnte ein Indiz dafür sein, dass bei dir $TERM falsch gesetzt ist. Welchen Wert hat diese Variable?
Sie enthält in der KDE Konsole nur den Wert xterm.
In einer echten Konsole (also ALT+F2 bzw. /dev/tty2) ist es der Wert "linux". Dort werden übrigens auch nur diese 6 bzw. 8 Farben angezeigt.
Wie gesagt, man muss sich bei diesem „einfachen“ Fall wahrscheinlich nicht auf tput versteifen. Jenachdem, was du für eine Zielgruppe hast, geht’s auch ohne.
Derzeit sind die Skripte nur für mich, das könnte sich aber irgendwann mal auch ändern.
|