Hogyan használjunk színeket a terminálban

botond küldte be 2018. 07. 30., h – 21:49 időpontban

Tartalom

 

Bevezető

A rendszeres, parancssori felületen végzett munka megterheli az ember szemét, ezért törekednünk kell arra, hogy minél könnyebben olvasható legyen a terminálban lévő szöveg.

Amikor létrehozunk egy shell felhasználót például Debianban, és elkezdjük vele a munkát, alapértelmezetten egyféle színnel jelenik meg minden. Így egy idő után elég fárasztóvá válik például a különböző parancsok kimenetei között keresgélni a határokat, mivel színek hiányában minden összeolvad. Vagy például egy könyvtár listázásánál bogarásznunk kell az alkönyvtárakat, amik egybefolynak a fájlnevekkel.

Vannak terminál programok, amik eltérő színekkel különböztetnek meg bizonyos szövegrészeket, pl. megjelenített IP-címek, vagy a különböző hiba szavak, hogy kiemeljék a fontosabbnak vélt részeket. Ilyen terminál program például a MobaXterm, amit én is használok. Azonban az ilyen automatizált módon történő kiemelés nem mindig elég, ezért saját megoldásokkal kell tarkítanunk a parancssort. 

Ebben a leírásban veszünk sorra néhány egyszerű praktikát, amivel színesebbé, kényelmesebbé tehetjük a terminálban végzett munkát.

A jobb szemléltethetőség kedvéért itt a sima Putty terminálban mutatom a kimeneteket, ami nem használ szintaktikai szövegkiemelést, így csak a saját színkezelési megoldások lesznek különböző színekkel kiemelve.

 

 

Színezzük a prompt-ot!

Szerintem a legkézenfekvőbb dolog ezen a téren, ha a prompt színezésével kezdjük, mivel ez választja el a parancsok kimeneteit egymástól, így optikailag sokkal tagoltabbá válik a terminál szövege. 

Először is járjunk utána, hogy hogyan lehet módosítani a prompt-unk színét. 

Ha belenézünk a home könyvtárunkban lévő .bashrc fájlba, akkor láthatunk benne részeket, amik a PS1 környezeti változónak adnak értéket, ami a prompt megjelenését szabályozza:

[...]
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt
[...]

Ebben a kódrészletben láthatjuk, hogy van itt színes prompt beállítás is, csak éppen ki van kapcsolva. Szerkesszük a fájlt például a nano programmal, majd vegyük ki a kommentet a kódrészlet első értékadó sora elől:

force_color_prompt=yes

Ekkor lefut a fájl első feltétele is, ahol a tput parancs meglétének vizsgálata után bekapcsolja a színes prompt-ot.

Mentsük le, és futtassuk le a .bashrc fájlunkat a source paranccsal:

source ~/.bashrc

Vagy a source parancs rövidítésével a "." -al:

. ~/.bashrc

Ezután már egyből egy színes prompt fogad bennünket:

Színek használata a terminálban - Színes prompt

Ezek a színek csak a "gyári" beállítás részei, természetesen lehetőség van egyéni színek beállítására.

Alapértelmezetten a prompt beállítás így néz ki:

\u@\h:\w\$

Ahol az "u" az Username, a "h" a Host és a "w" pedig a Working directory, azaz az aktuális könyvtár. Persze még van több változó is, amikkel például a dátumot, időt is kiírathatjuk, de most csak ezekkel foglalkozunk.

Ha visszanézünk a fenti kódrészletre, akkor láthatjuk, hogy először egy feltétel második ágában futott le az alapértelmezett beállítás, majd miután kivettük a kommentet az értékadás elől, már a feltétel első ága futott le, amiben az a sok cifra karaktersorozat van, amik között rejtőznek az imént említett prompt változók.

Itt lényegében annyi történik, hogy a terminálnak illetve a Bash parancsértelmezőnek különböző escape azaz vezérlőkarakterekkel lehet megmondani, hogy az utána lévő karakterek milyen színnel/háttérszínnel/attribútummal jelenjenek meg. Majd a színezni kívánt rész után ismét kell egy úgynevezett resetelő karaktersorozat, ami visszaállítja a szín attribútumokat az alapállapotra. Majd utána a következő résznél új szín atribútum jön, ezután jön a következő változó, majd ismét reset. És így tovább.

Hogy egyszerűbben megértsük ennek a logikáját, futtassuk le a következő parancsot:

echo -e "alap \033[01;32m zöld \033[00m alap"

Aminek a kimenetén egyből látható a lényeg:

Színek használata a terminálban - Szín attribútum karakterek

Az echo parancsnak ilyenkor kell a -e kapcsoló, ami engedélyezi a speciális karakterek értelmezését a karakterláncokban. Enélkül csak simán, egy az egyben írná ki az idézőjelek közti részt.

 

 

Így már jobban érthető az egész. A különböző színkódokat és a karakterek speciális viselkedéséért felelős attribútumokat a leírás utolsó fejezetében tárgyaljuk ki részletesen, most térjünk vissza a prompt színeinek állítgatásához.

Tehát láthattuk a működési elvét az egésznek, így most már könnyebben el tudjuk kezdeni magunk is a prompt színeinek variálását. Kísérletezgetésre kiválóan alkalmas a http://ezprompt.net/ Bash PS1 generáló weboldal, ahol vizuálisan állíthatjuk össze a saját prompt-unkat:

Színek használata a terminálban - Színes prompt generálása az ezprompt.net weboldal segítségével

Ezen az oldalon kényelmesen rakhatunk össze bármilyen prompt-ot, tetszőleges színekkel (nekem éppen ez a kedvenc összeállításom). Ha elkészült a remekművünk, akkor csak az alsó szövegdobozból kell kimásolnunk a PS1 környezeti változónak értéket adó kódsort, amit behelyettesíthetünk a ~/.bashrc fájlunk fent mutatott kódrészletének a megfelelő sorába (célszerűb inkább kikommentezni az eredeti PS1 értékét beállító sort, és ezt alá másolni, hogy bármikor vissza tudjunk állni a gyári beállításra), majd a fent mutatott source paranccsal ismét lefuttatni a ~/.bashrc fájlt, és már készen is van a színes prompt-unk.

 

Ne felejdük, hogy ezt minden felhasználónál el kell végezni, így a root-nál is, hogyha root-ként is szeretnénk színes prompt-ot használni.

 

Használjuk a parancsok színes opcióit, ahol lehet!

A következő praktikával a különböző parancsok kimeneteit kelthetjük életre a színek használatával. Sok parancs rendelkezik olyan kapcsolóval, amivel a saját kimenetét emeli ki színek használatával. Vegyünk néhány példát.

ls parancs

Az ls talán az egyik leggyakrabban használt parancs a Linux terminálban, amivel a könyvtárak tartalmát listázhatjuk ki sokféle módon. Az ls súgójában találhatunk egy -C vagy --color kapcsolót, amivel kihasználhatjuk a parancs színkezelő opcióját. Sok esetben a ~/.bashrc fájlban már előre definiálják az ls parancs alias-ában ezt a kapcsolót:

[...]
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    #alias grep='grep --color=auto'
    #alias fgrep='fgrep --color=auto'
    #alias egrep='egrep --color=auto'
fi
[...]

Ebben a .bashrc fájlban (Debian 8.10) tehát már be van kapcsolva az ls parancs színkezelő opciója alapból (az első alias sor nincsen kikommentezve), aminek hatására például a gyökérkönyvtár listázásának a kimenete:

Színek használata a terminálban - Színes ls parancs kimenet

Viszont a root felhasználónál nincsen bekapcsolva alapértelmezettként. Ha belépünk root-ként és ugyanígy kilistáztatjuk a gyökérkönyvtárat, akkor a kimentünk nem lesz színes:

Színek használata a terminálban - Egyszínű root ls parancs kimenet alapból

Itt már bizony nincsenek színek, sőt, még a prompt-unk sem színes. Ugye mennyivel nehezebb olvasni az egészet?

Ezt könnyen orvosolhatjuk, ha megnyitjuk a /root/.bashrc fájlt, és kivesszük a kommentet a következő három sor elől:

[...]
export LS_OPTIONS='--color=auto'
eval "`dircolors`"
alias ls='ls $LS_OPTIONS'
[...]

Majd lefuttatjuk a fájlt, hogy érvényesüljenek a változások:

. /root/.bashrc

És most újra kilistázzuk a gyökérkönyvtárat:

Színek használata a terminálban - Sínes root ls parancs kimenete

Itt már megjelennek a színek a root felhasználó ls parancs kimeneteiben is. Így már sokkal áttekinthetőbb az egész. Ha még ezt megfejeljük egy további könyvtár előre rendezési kapcsolóval is:

[...]
export LS_OPTIONS='--color=auto --group-directories-first'
[...]

 

 

és újra futtatjuk a .bashrc fájlt, ahogyan az előbb, akkor a következő könyvtár listázásunk kimenete már egészen barátságos lesz:

Színek használata a terminálban - Rendezett, színes ls parancs kimenete

Így még áttekinthetőbbé vált az egész, mert a könyvtárakat sorolja előre, ami sokkal jobb olvashatóságot biztosít.

Az ls parancs a színsémáját a dircolors programtól kapja, ami feltölti az "LS_COLORS" környezeti változóba a különböző fájlkiterjesztésekhez társítandó színkódokat. Tehát ha lefuttatjuk ezt a programot:

dircolors

Akkor kapunk egy hosszú, kettőspontokkal szeparált listát, amiben fel vannak töltve a különböző fájlkiterjesztések és a színkódjaik:

LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:';
export LS_COLORS

Majd a végén az export parancsot lefuttatva tölti fel az LS_COLORS környezeti változóba.

Ezután az ls parancsot használva az innen fogja tudni, hogy a könyvtár listázásakor a könyvtárban talált fájlokat milyen színnel jelenítse meg a fájlkiterjesztésük alapján.

Így ha esetleg valakinek kedve támad variálni ezeken a színeken, akkor csak ezt a két (értékadó és exportáló) sort kell bemásolni a .bashrc fájljába a módosított értékekkel.

grep parancs

A grep parancs segítségével mintákat kereshetünk a fájljainkban, vagy éppen a csővezetéken kapott kimenetben. Ha megnézünk egy egyszerű példát, amivel a felhasználó home könyvtárában megkeressük (rekurzívan az összes fájlban) az "if" szót:

grep -rnw . -e "if"

akkor kapunk egy olvashatatlan, egybefolyó, színtelen kimenetet:

Színek használata a terminálban - Grep parancs kimenete

Az ls-hez hasonlóan a grep-nek is van egy ugyanilyen "--color=auto" kapcsolója. Ha most ugyanezt a keresést végrehajtjuk ezzel a színkezelő kapcsolóval:

grep -rnw --color=auto . -e "if"

Színek használata a terminálban - Színes grep parancs kimenete

Akkor már teljesen más lesz a kimenet. Kapunk fájlnév színezést, sorszám kiemelést, és természetesen a keresett mintát is kiemeli nekünk a grep parancs. Tehát megéri használni ezt a kapcsolót. Ha pedig rendszeresen használjuk, akkor a fenti .bashrc fájlban lévő kommentet kell kivenni a grep parancs elől, és futtatni a .bashrc-t és onnantól már alapból lesznek színek a grep-es kereséseknél.

 

Vannak még egyéb parancsok is, amik tudnak színeket kezelni, ezért a gyakrabban használt parancsoknál keressük a súgójában a kimenet színkezelésére utaló kapcsolókat, mint például az ls és a grep esetén a "--color". Azután a fenti minta alapján beépíthetjük őket a .bashrc fájlunkba, hogy mindig színes kimenetet kapjunk az adott parancsok használatakor.

 

 

Nem árt tudni, hogy egyetlen apró szépséghiba van ebben az egészben, mégpedig hogy a Bash ezeket a szín attribútumokat nem tudja átvinni a csővezetékeken. Így például ha van egy hosszabb, csővezetékekkel összeláncolt parancsunk, amiben az elején színes kimenetet kaptunk, akkor a végeredményben már sajnos nem lesznek színek. Így ha mindenképpen színes kimenetet szeretnénk a csővezetékek után is, akkor különböző kerülő megoldásokat kell alkalmaznunk.

 

Lapozó

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