\Escape: Farbičky
Terminály vedia pomocou escape sekvencií všeličo. Ukážeme si, ako sa dá zo všednej *nixoidnej textovej konzoly spraviť farebná, aj ako ofarbiť rôzne ovocie a dreviny v nej.
Escape
Riadiace sekvencie ANSI terminálu umožňujú robiť všeličo s obrazovkou, kurzorom, aj textom. Vo všeobecnosti začínajú znakom Escape, t.j. 27 (dec), 0x1B (hex), alebo \033 (oct). Znak Escape môžeme v konzole vypísať jedným z týchto spôsobov (nie všetky musia všade fungovať):
echo -e "\e"
echo -e "\033"
echo x | tr 'x' '\033'
Ako vypisovať farebne
Atribúty textu je možné nastavovať sekvenciou
esc[atribútm
, prípadne viacero atribútov oddelených
bodkočiarkou:
#!/bin/bash # priklad c.1, escape ukazka echo -e "\033[1msvetly\033[0m text" echo -e "\033[1;31msvetlocerveny\033[0m text" echo -e "text \033[1;33;41ms pozadim\033[0m"
Pre farby popredia slúžia čísla 30 (čierna) až 37 (biela), pre pozadie 40 až 47. Ďalej je možné použiť nasledujúce špeciálne atribúty:
- 0 - zruš atribúty (vrátane farby)
- 1 - svetlá (bold)
- 2 - tmavá (niekde sa zobrazuje ako podčiarknuté)
- 3 - kurzíva (málo podporované)
- 4 - podčiarknuté
- 5 - blikajúce (resp. svetlé pozadie)
- 7 - reverzne (niekde sa farby vymenia, niekde biele pozadie)
- 8 - skryté (niekde sa napriek tomu zobrazí)
Odporúčam používať iba farby popredia, tmavé pozadia, atribút "svetlá farba", prípadne "podčiarknuté" - tie sú totiž podporované a zobrazované rovnako (okrem hnedej, resp. tmavej žltej [33m) na väčšine farebných terminálov, vrátane xterm, rxvt, PuTTY, ba dokonca aj HyperTerminal a telnet (aspoň vo Win2k). S ostatnými atribútmi je to rôzne, záleží od konkrétneho terminálu - treba vyskúšať.
Na výber "vhodnej" farby na použitie, a tiež odskúšanie atribútov, je možné použiť nasledujúci skript `colors` (pri kopírovaní pozor na počet medzier medzi apostrofmi):
#!/bin/bash # colors - tabulka farieb, (c) 2007 by Matej t='tXt' #extra='4;' # odkomentuj, prip. vymen cislo for fg in head ' ' ' 1' ' 30' '1;30' \ ' 31' '1;31' ' 32' '1;32' ' 33' '1;33' \ ' 34' '1;34' ' 35' '1;35' ' 36' '1;36' \ ' 37' '1;37'; do f=${fg// /} fs=$f; [ "$fs" = "" ] || fs="$fs;" [ "$fg" = "head" ] && echo -en "\t " || \ echo -en " ${fg}m \033[$extra${f}m$t" for b in '' '5;'; do [ "$fg" = "head" ] && echo -n $b || \ echo -n "${b//*/ }" for bg in 40 41 42 43 44 45 46 47; do [ "$fg" = "head" ] && echo -n "${bg}m " || \ echo -en " \033[$extra$b$fs${bg}m$t\033[0m" done done; echo done; echo
Farebne v DOSe
Windows ani DOS sám o sebe (command.com) farbiť nevie, slúži mu na to
ANSI.SYS, ktorý treba načítať v CONFIG.SYS. Pre dosemu
môžeme do
/usr/local/share/dosemu/freedos/config.sys (alebo kde je) pridať:
devicehigh=c:\bin\nansi.sys
1. Farebný motd
Ofarbený text do /etc/motd môžeme zapísať priamo, presmerovaním `echo` z príkladu č.1 > /etc/motd
# priklad c.2, farby priamo do motd echo -e "\033[1m`uname -n`\033[0m \ had been \033[1;33;41mhacked\033[0m" >> /etc/motd
Zložitejší súbor je lepšie editovať súbor pomocou bežného textového editora. Odporúčam začať obsahom (textom, rozložením), ktorý chceme ofarbiť, až potom pridať farby. Kontrola, či to vyzerá tak ako chceme, je jednoduchá:
cat /etc/motd
Podobne môžeme nadefinovať tzv. Banner súbor pre sshd, ktorý sa zobrazí ešte pred loginom.
Existujú aj ASCIIart editory podporujúce ANSI farby, nájsť sa mi však podarilo iba okienkové pre Windows platformu. Ak niekto dáky dobrý do konzoly poznáte, dajte vedieť.
2. Farebný Bash prompt
Primárny prompt v shelli je určený premennou PS1
, sekundárny
PS2
. Zo všedného "\u@\h:\w\$
" môžeme urobiť farebný
napríklad takýmto skriptom (umiestniť do /etc/profile.d/prompt-colors.sh,
alebo iba volať z .bash_profile, .bashrc):
# /etc/profile.d/prompt-colors.sh # nastavenie farieb promptu pre Bourne shelly if [ "`id -u`" = "0" ]; then # roota zvyraznime cervenou endpart="\[\033[1;30m\]#\[\033[0m\] " PS2="\[\033[1;30m\]>\[\033[0m\] " else endpart="\[\033[0m\]\$ " PS2="\[\033[0m\]> " fi PS1="\[\033[1;36m\]\u@\h\[\033[0m\]:\[\033[33m\]\w$endpart" unset endpart
Nesmieme zabudnúť na uzatváranie netlačiteľných znakov (t.j. celých escape
sekvencií) medzi \[
a \]
, inak bash nebude správne
vedieť určiť šírku vypísaného riadku, a bude nesprávne zalamovať.
3. Farebný C-shell prompt
V C-shelli sa pre primárny a sekundárny prompt používajú premenné
prompt
a prompt2
. Princíp ofarbenia je rovnaký ako
v Bashi. C-shell používa trochu iné špeciálne znaky, escape sekvencie je nutné
vkladať medzi %{
a %}
. Vyššieuvedený skript má
ekvivalent:
# /etc/profile.d/prompt-colors.csh # nastavenie farieb promptu pre c-shelly if ( "$uid" == "0" ) then set endpart="%{\033[1;30m%}>%{\033[0m%} " set prompt2="%{\033[1;30m%}?%{\033[0m%} " else set endpart="%{\033[0m%}> " set prompt2="%{\033[0m%}? " endif set prompt="%{\033[1;36m%}%n@%m%{\033[0m%}:%{\033[33m%}%~$endpart" unset endpart
4. Farebné ls
Iste už veľa z vás videlo farebný výpis obsahu adresára pomocou ls - mnoho distribúcií Linuxu to totiž má v štandardných konfigurákoch. Nastavenie farieb program ls cucá z premennej LS_COLORS. Tú obvykle nastavujeme pomocou dircolors (v Slacku je súčasťou balíka coreutils) takto:
eval `dircolors -b` # bash eval `dircolors -c` # csh
Cvične si fgrepnite /etc a nájdite si, odkiaľ je to spúšťané, môže to byť napr. /etc/profile, /etc/profile.rc, /etc/csh.login, alebo aj v /etc/profile.d/* apod.
Na to, aby ls vypisoval farebne, je navyše potrebné spustiť ho s prepínačom --color. Väčšinou sa používa:
alias ls='ls --color=auto'
Prepínač --color=auto zaistí, že farebne sa bude vypisovať iba na
terminál, ktorý to podporuje. Totiž taký `/bin/ls --color |
less
` vypisuje do rúry aj neželané escape sekvencie.
5. Farebný grep
Podobne ako ls je možné ofarbiť aj grep. Štandardne dočervena, postačí nám:
alias grep='grep --color=auto'
Ak nám červený grep nechutí, môžeme ho zmeniť pomocou premennej
GREP_COLOR
, napríklad na horkejší žltý:
export GREP_COLOR="1;33"
6. Farebný less
Niekedy môžeme chcieť zobrazovať farebné výstupy cez less tak, aby sa
zobrazili farebne (a nie ako podivné sekvencie znakov, čo narúšajú text).
Môžeme na to použiť prepínač -R
, pri častej potrebe opäť
spravíme alias.
7. Farebný pine
Da best poštový klient pine
tiež podporuje farby (a vie s
nimi divy). Farby zapneme a nastavíme v menu (S)etup-(K)olor, pre pravidlá
sa farby nastavujú v (S)etup-(R)ules-(I)ndexcolor.
Čo s xtermom
Farebné pozadie textu robí problémy pri nastavenej inej štandardnej farbe
pozadia terminálu. Ak používame vyslovene bielu farbu popredia (37), nebude
text na bielej farbe pozadia vidno, preto je žiadané nastaviť čierne pozadie.
Vypisovaný text potom ale robí zubaté čierne riadky na bielom pozadí okna.
Riešením je nenastavovať farbu pozadia textu (ktorá by nám robila zuby na
prípadnom background obrázku), ale zmeniť nastavenie terminálu.
Pre xterm
v súbore ~/.Xresources:
XTerm*background: black XTerm*foreground: gray XTerm*highlightColor: white
Netreba to preháňať
Nie každý používateľ má rád farby, a nie každý má rád rovnaké farby. Preto je vhodné dať na výber. Riešiť to môžeme napríklad načítaním nejakého konfiguračného súboru s farbami zo skriptu prompt-colors.sh, ktorý si používateľ môže vo svojom homedire meniť.
Nie každý terminál farby podporuje, systém by to mal rozpoznať a podľa TERMCAP sa správne zachovať. Ak však bežne používame staršie terminály ako napr. vt52, a robia nám farby problém so zobrazovaním, je lepšie nepoužívať ich, alebo používať iba v podmienke typu "ak je terminál vt100|xterm|..., potom použi farby".
Záver
Farby v termináli podporuje veľa aplikácií. Ak sú použité rozumne a s mierou, môžu veľmi spríjemniť prácu. Naznačil som nastavenie u tých, ktoré s obľubou používam farebné. Ak viete o nejakej ďalšej, ktorá vie s farbami robiť z práce v termináli radosť ešte viac ako tie, čo už boli spomenuté, ozvite sa. Aj za ASCIIart ANSI-enabled editor do *nix terminálu by som bol vďačný :)
Pôvodne uverejnené na portáli
blackhole.sk, kde si
môžete pozrieť aj
diskusiu.
Ďalšie informácie aj na:
Wikipedia: ANSI escape kódy