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:
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:
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:
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:
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:
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.
Lapozó
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
- 553 megtekintés