Hogyan használjunk színeket a terminálban (2. oldal)

botond küldte be 2018. 07. 30., h - 22:14 időpontban

Tartalom

 

Az előző oldalon bevetettünk néhány praktikát a terminál színesebbé tételére, de még van pár dolog, amit érdemes kipróbálni.

 

 

Használjunk színeket a szkriptjeink kimeneteiben!

Amikor szkriptekkel automatizáljuk feladatainkat, érdemes megfontolni, hogy különböző színekkel jelenítsünk meg különböző kimeneti állapotokat. Például ha a folyamatban valami sikeresen lefutott, akkor azt zöld színnel emeljük ki, ha pedig hibaüzeneteket kell megjelenítenünk, akkor azt piros színnel különböztetjük meg.

Ezzel az egyszerű példával szemléltetem ennek a megvalósítását:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
 
# Terminál színek módosítása és visszaállítása ANSI/VT100 escape szekvenciákkal
 
zold1=$(echo -e "\e[00;32m")                    # Zöld kiemelőszín (1. módszer)
zold2=$(echo -e "\033[00;32m")                  # Zöld kiemelőszín (2. módszer)
zold3=$(echo -e "\x1B[00;32m")                  # Zöld kiemelőszín (3. módszer)
 
piros1=$(echo -e "\e[00;31m")                   # Piros kiemelőszín (1. módszer)
piros2=$(echo -e "\033[00;31m")                 # Piros kiemelőszín (2. módszer)
piros3=$(echo -e "\x1B[00;31m")                 # Piros kiemelőszín (3. módszer)
 
reset1=$(echo -e "\e[0m")                       # Színek reset-elése (1. módszer)
reset2=$(echo -e "\033[0m")                     # Színek reset-elése (2. módszer)
reset3=$(echo -e "\x1B[0m")                     # Színek reset-elése (3. módszer)
 
# Terminál színek módosítása és visszaállítása a setaf programmal
 
zold4=$(tput setaf 2)                           # Zöld kiemelőszín (4. módszer)
 
piros4=$(tput setaf 1)                          # Piros kiemelőszín (4. módszer)
 
reset4=$(tput sgr0)                             # Színek reset-elése (4. módszer)
 
# Megjelenítések
 
echo "${zold1}Zöld szín ${reset1} visszaállítva (\e ANSI szekvenciával)"
echo "${zold2}Zöld szín ${reset2} visszaállítva (\033 ANSI szekvenciával)"
echo "${zold3}Zöld szín ${reset3} visszaállítva (\x1B ANSI szekvenciával)"
echo "${zold4}Zöld szín ${reset4} visszaállítva (tput paranccsal)"
 
echo "${piros1}Piros szín ${reset1} visszaállítva (\e ANSI szekvenciával)"
echo "${piros2}Piros szín ${reset2} visszaállítva (\033 ANSI szekvenciával)"
echo "${piros3}Piros szín ${reset3} visszaállítva (\x1B ANSI szekvenciával)"
echo "${piros4}Piros szín ${reset4} visszaállítva (tput paranccsal)"
 
# A színes részek után mindig reseteljük a színeket.

A szkript kimenete pedig:

Színek használata a terminálban - Színek használata szkriptekben

Ebben a példában láthatjuk, hogy többféleképpen is megadhatjuk a színkombinációt a terminálnak. Az első három módszernél ANSI/VT100 escape szekvenciákat alkalmaztunk a színezni kívánt rész előtt, utána pedig a reset-elő szekvenciákkal visszaállítottuk az alapértelmezettre. A negyedik módszerrel pedig a tput program segítségével változtattuk meg a szín attribútumokat. A tput program kimondottan a terminál különböző attribútumainak kiolvasására vagy módosítására szolgál, mint például a színek kezelése,  a terminál sor/oszlopméret lekérdezése vagy a kurzor pozíciójának lekérdezése, módosítása. A program működési elve hasonló: A kapott paraméterek alapján a kimenetén előállítja a megfelelő escape szekvenciákat helyettünk, így nem nekünk kell bepötyögni azokat.

Mindegyik szín módosítási megoldás működési elve ugyanaz: Egy sub-shellben lefuttatunk egy parancsot, aminek a kimenetét egy változóba tesszük. Az első háromnál ez az echo parancs, míg a negyedik módszernél a tput. A változóban tárolt érték pedig mindegyik esetben a szín attribútum módosítására szolgáló escape szekvenciák. Az első három echo-s megoldásnál akár direktben is alkalmazhatnánk a kimenetre íráskor ezeket az idézőjelek közötti vezérlőkarakter részeket, de akkor a -e kapcsolót is mindig használnunk kellene, továbbá a kód sem lenne jól olvasható.

Ezekkel a módszerekkel tehát színessé tehetjük szkriptjeinket, így például a gyakran használt automatizálási feladatoknál jól láthatóan ki tudjuk emelni a kimenet fontosabb részeit.

A színkódokat – ahogy korábban is ígértem – az utolsó fejezetben listázom ki.

 

Állítsuk be a terminál színeit!

Ha már rutinosan használjuk a színeket a terminálban, akkor érdemes utánajárni, hogy a terminálban, amit használunk, van-e lehetőség a színek kalibrálására. Például ha valamelyik színt nem találjuk eléggé világosnak, figyelem felkeltőnek, akkor a terminál beállításaiban tudunk ezen javítani.

Mivel a Putty a legelterjedtebb terminál program, ezért most ennek a beállításait nézzük meg. Ha elindítjuk a programot, a kis főablakában kattintsunk a Window kategória Colours almenüjére, ahol sok beállítási lehetőség fogad:

Színek használata a terminálban - Putty színbeállítások

Itt kiválasztjuk valamelyik színt, amelyiket módosítani szeretnénk, majd rákattintunk a Modify gombra és előjön a színválasztó ablak:

Színek használata a terminálban - Putty színbeállítások - Szín kiválasztása

Itt beállítjuk a nekünk megfelelő színt, majd leokézzuk.

Ezzel szépen lehet finomhangolni a terminál színeit, hogy elérjük a kívánt szín összeállítást. Természetesen ez a módosítás csak nálunk lesz érvényes. Továbbá azt is érdemes még észben tartani, hogy ahány terminál program, annyiféle színpaletta van, tehát ami nálunk például sötétkék, az másnál esetleg másik kék árnyalatban fog megjelenni.

 

ANSI/VT100 escape szekvenciák működése

Ahogy korábban már szóba került, többféleképpen lehet utasítani a terminált arra, hogy színt változtasson a következő kiírandó karakternél. Vagy különböző escape szekvenciákat (vezérlőkaraktereket) alkalmazunk a kiírandó rész előtt, vagy segítségül hívjuk a tput programot, ami elküldi helyettünk a terminálnak a megfelelő vezérlőkaraktereket.

A Bash háromféle escape szekvenciát támogat, ezek az alábbiak:

  • \e
  • \033
  • \x1B

Működésük itt most teljesen megegyezik, így a továbbiakban az elsőt fogjuk használni a keveredés elkerülése végett.

Ezeket a vezérlőkaraktereket többféleképpen is használhatjuk:

Ha csak egy kódot adunk meg, akkor így néz ki: "\e[xxm" - ahol az xx a szín kódját vagy háttérszín kódját vagy az attribútum kódját is jelölheti. Példa:

echo -e "\e[31mPiros"

Ebben a példában 31-es színkód szerepel, tehát a piros. Így a "\e[31m" utáni részt már pirossal írja ki.

Vagy ha két tagú kódot adunk meg, akkor: "\e[aa;xxm". Itt is lehet bármelyik az attribútum kód, vagy színkód, vagy háttérszín. Pontosvessző választja el a két kódot. Az attribútumok különböző állapotokat jelölnek, például villogás, fényesebb állapot, aláhúzott állapot, kövér betűk, stb. Példa:

echo -e "\e[04;31mPiros"

Ebben a példában a piros színkód elé került egy 04-es attribútumkód, ami az aláhúzást jelenti. Így tehát a "Piros" karakterlánc aláhúzott, piros karakterekkel fog megjelenni.

És használhatunk három tagú kódot is, pl.:

echo -e "\e[04;31;44mPiros"

Itt pedig mögé került egy 44-es kódú kék háttérszín. Így a "Piros" felirat piros, aláhúzott szöveggel és kék háttéren jelenik meg.

Terminálba másolva könnyen ellenőrizhetjük, próbálgathatjuk ezeknek működését.

Ezek tehát az ANSI/VT100 escape szekvenciák. A könnyebb felhasználhatóság érdekében ezeket a szekvenciákat elkülönítve (az utána lévő részektől) változókban tároljuk, amiket már sokkal könnyebben tudunk felhasználni. Lásd fenti script példa.

 

 

Színkódok és attribútumok táblázatai

Attribútumok

Kód Működés
0 Attribútumok törlése
1 Félkövér
2 Halvány *
3 Standout *
4 Aláhúzás
5 Villogás
7 Inverz
8 Láthatatlan *

A *-al megjelölt attribútumok nálam nem működtek egyik terminálon sem.

Karakter színek

Az alábbi táblázatban a 16 színű terminál színek kódjai szerepelnek.

Kód Szín
39 Alapértelmezett szín
30 Fekete
31 Piros
32 Zöld
33 Sárga
34 Kék
35 Magenta
36 Cián
37 Világos szürke
90 Sötét szürke
91 Világos piros
92 Világos zöld
93 Világos sárga
94 Világos kék
95 Világos magenta
96 Világos cián
97 Fehér

Háttér színek

Az alábbi táblázatban a 16 színű terminál színek kódjai szerepelnek.

Kód Szín
49 Alapértelmezett szín
40 Fekete
41 Piros
42 Zöld
43 Sárga
44 Kék
45 Magenta
46 Cián
47 Világos szürke
100 Sötét szürke
101 Világos piros
102 Világos zöld
103 Világos sárga
104 Világos kék
105 Világos magenta
106 Világos cián
107 Fehér

Példaprogramok

Az első példaprogramban két ciklussal kilistáztatjuk a karakterszíneket és a háttérszíneket:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
 
# Karakterszínek és háttérszínek megjelenítése 16 színű terminál színekkel
 
alahuzas=$(echo -e "\e[04m")    # aláhúzás szekvenciája
alap=$(echo -e "\e[0m")         # reset szekvenciája
 
echo "${alahuzas}Karakter színek:${alap}"
for szinkod in 39 {30..37} {90..97} ; do
    [[ $szinkod = 30 ]] &&  szinkod=$szinkod";107"
    echo -e "\e[${szinkod}mKarakterszín kódja: ${szinkod}${alap}"
done
 
echo
 
echo "${alahuzas}Háttér színek:${alap}"
for hatterkod in 49 {40..47} {100..107} ; do
    echo -e "\e[${hatterkod}m     \e[0m Háttérszín kódja: ${hatterkod}${alap}"
done
 
exit 0

A kimenete pedig:

 

Színek használata a terminálban - 16 színű példaprogram

A program elején két változóba tölti be az aláhúzás és a reset szekvenciákat, és ezeket használja lejjebb is, hogy a kód áttekinthetőbb legyen. Az első ciklusban bekerült egy feltétel, ami a 30-as színkód (fekete) esetén hozzáad még a szín attribútumhoz egy 107-es (fehér) háttérszínt, hogy látszódhasson rajta a fekete karakterszín. A második ciklusban pedig 5 darab szóköz karaktert ír ki az aktuális háttérszínnel, majd utána reseteli a karakter attribútumokat, és azután az alapszínnel írta ki a színkódokat.

A következő példaprogramban érdekességképpen megjelenítjük a 256 színű palettát a karakterszínek és a háttérszínek kódjaival:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash
 
# Karakterszínek és háttérszínek megjelenítése 256 színű terminál színekkel
 
alahuzas=$(echo -e "\e[04m")    # aláhúzás szekvenciája
alap=$(echo -e "\e[0m")         # reset szekvenciája
karakterszin_mod=38             # 256 színű üzemmód karakterszín módja
                                # 3 tagú szekvenciája: "\e[38;5;Xm" Ahol az X a színkód (0-255)
                                
hatterszin_mod=48               # 256 színű üzemmód háttérszín módja
                                # 3 tagú szekvenciája: "\e[48;5;Xm" Ahol az X a színkód (0-255)
                                
oszlopok_szama=15               # Soronként megjelenítendő oszlopok száma
 
echo "${alahuzas}Karakter színek:${alap}"
 
for szin in {0..255} ; do
    printf "\e[${karakterszin_mod};5;%sm  %3s  \e[0m" $szin $szin   # tabulálás printf-el
    [ $((($szin + 1) % $oszlopok_szama)) == 0 ] && echo             # maradékos osztással törjük a sorokat.
done
 
echo
 
echo "${alahuzas}Háttér színek:${alap}"
 
for szin in {0..255} ; do
    printf "\e[${hatterszin_mod};5;%sm  %3s  \e[0m" $szin $szin     # tabulálás printf-el
    [ $((($szin + 1) % $oszlopok_szama)) == 0 ] && echo             # maradékos osztással törjük a sorokat.
done
 
echo
 
exit 0

Ennek a kimenete pedig:

Színek használata a terminálban - 256 színű példaprogram

A példaprogramban igyekeztem minél több paramétert változóba tenni, hogy könnyebben értelmezhető legyen minden.

Amint látjuk, még 256 színt is tudnak kezelni a terminálok. A 256 színű színkezelés pedig úgy történik, hogy egy három tagú ANSI kódszekvenciát írunk ki a kimenetre, amik a karakter szín módosításnál a következők: 38;5;X. Ahol az X jelenti a 0-255 közé eső színkódot. Háttérszín módosításánál pedig a 48;5;X a szekvencia, itt is az X a színkód. Lássuk ezt példával is:

echo -e "\e[38;5;128mLila \e[38;5;46mÉlénk zöld \e[38;5;208mNarancssárga"

És ugyanezek a színek háttérszínekkel:

echo -e "\e[48;5;128mLila \e[48;5;46mÉlénk zöld \e[48;5;208mNarancssárga"

Persze itt még elé kell tenni egy fekete karakterszínt (30) is, hogy látszódjanak is a feliratok, és a végére teszünk még egy resetelést (0) is, hogy ne maradjon csík a terminálban:

 echo -e "\e[30m \e[48;5;128mLila \e[48;5;46mÉlénk zöld \e[48;5;208mNarancssárga \e[0m reset"

Terminálban futtatva ezeket a sorokat, lehet kísérletezgetni a színekkel a fenti paletta segítségével.

Itt látható, hogy ezeket a szekvenciákat egymás után is fűzhetjük, így bármilyen szín/attribútum kombináció összeállítható.

 

Konklúzió

Ezekkel a praktikákkal tehát kiveséztük a terminálok színkezelését, amiknek köszönhetően komfortosabbá tehetjük a terminálban végzett munkát, valamint ezek a szín kiemelések figyelemfelkeltésre is kiválóak, például ha valamelyik szkriptünkben rendellenes dolog történik, akkor a megfelelő színt társítva a jelenséghez hamarabb átlátjuk a problémát.

 

Felhasznált források, hasznos linkek:

 

Lapozó

Ez a leírás több oldalból áll: