Nico Golde <nico/at/ngolde.de>
O Autorze:
Obecnie Nico jest wciąż uczniem. Od kilku lat zajmuje się
z determinacją Linuksem, uczestniczy także w kilku projektach
Open Source.
Tłumaczenie na język polski:
B.J.F. Stobiecki <bjfs/at\op.pl>
Zawartość:
|
Kolorowe Powłoki -- Używanie kolorowych sekwencji wyjścia ANSI
Notka:
W terminalu kompatybilnym ze standardem ANSI (jak xterm, rxvt,
konsole ...) tekst może być wyświetlany w kolorach innych niż
czerń i biel. Ten artykuł zademonstruje tekst pogrubiony
bądź kolorowy.
_________________ _________________ _________________
|
Wprowadzenie
Na codzień każdy użytkownik Linux styka się z powłoką Bash.
Początkowo wydaje się on bardzo nudny, ale jest wiele możliwości
aby go zindywidualizować. Kolorowanie znaku zechęty czyni powłokę
zarówno lepszą jak i bardziej czytelną.
W swoim opisie będe się odwoływał do powłoki Bash. Sekwencje
wyjścia mogą się różnić w zależności od poszczególnych terminali.
W tym artykule używam terminal ANSI.
Konfiguracja Powłoki
Ustawianie kolorów powłoki ma miejsce w osobistym pliku
konfiguracyjnym bash ~/.bashrc bądź w globalnym pliku
konfiguracyjnym /etc/bashrc. Wygląd znaku zachęty jest
ustawiany przez zmienną środowiskową PS1 w bashrc.
Ogólnie, wpis powinien wyglądać tak:
~/.bashrc: PS1="\s-\v\$ "
\s oznacza nazwę powłoki, a -\v oznacza jej wersję. Na końcu
znaku zachęty ustawiamy $. Ponieważ jest to dość nudne, następujący
wpis - który jest domyślny dla większości dystrybucji Linux - może
być użyty:
~/.bashrc: PS1="\u@\h \w \$ "
|
Oznacza to użytkownik@ obecny_katalog $. Jest to znak zachęty,
z którym większość użytkowników Linux jest obeznana.
Sekwencje Wyjścia
Aby dodać osobisty urok kolorując znak zachęty, będziemy używali
sekwencji wyjścia. Sekwencja wyjścia jest instrukcją
kontrolną, która nakazuje powłoce wykonanie określonego kroku.
Sekwencja wyjścia z reguły zaczyna się od znaku ESC (stąd nazwa)
[po angielsku sekwencja wyjścia nazywa się escape sequence, przyp.
tłum.]. W powłoce pokazywana jest jako ^[. Taki styl pisania wymaga
przyzwyczajenia, \033 oznacza to samo (ESC w ASCII jest dziesiętnie
27, które ósemkowo daje 33).
Aby bezpośrednio w powłoce wprowadzić sekwencję wyjścia możemy
ją poprzedzić poprzez ctrl-v: CTRL-v ESC
Używanie Kolorów Powłoki
Wytłumaczę kolory powłoki z przykładowym znakiem zachęty.
~/.bashrc: PS1="\[\033[0;32;40m\u@\h:\w\$ \]"
Wyświetla to cały znak zachęty w zieleni. Jak tutaj:
\033 rozpoczyna sekwencję wyjściową, z [ zaczynamy definicję
kolorów. Następujące 0 określa domyślną szerokość czcionki.
Inne możliwości odnośnie tego przedstawię później. Ciąg znaków
będzie otoczony w \[ i \] , aby powstrzymać tekst sekwencji
wyjściowej przed pokazywaniem się na powłoce i zajmowaniu
zbyt wiele miejsca.
Następnie wybierzemy kolor pierwszego planu (w tym przypadku
32, które oznacza zieleń). Kolor tła 40 określa czerń. Aby
powstrzymać tekst po znaku zachęty przed wyświetlaniem się
na zielono, zamkniemy sekwencję wyjściową poprzez \033[0m ,
który jest domyślnym kolorem powłoki. Dla pierwszego planu
jak i tła mamy osiem kolorów.
Do wyboru mamy: czerwony, zielony, żółty, niebieski, karmazynowy,
turkusowy i biały. Kody kolorów: 30 (czarny), 31 (czerwony), 32
(zielony), 33 (żółty), 34 (niebieski), 35 (karmazynowy),
36 (turkusowy), 37 (biały).
Ustawianie tła jest bazowane na tej samej zasadzie, z tym, że
zamiast pierwszej cyfry '3' używamy '4', jak 40, 41, 42, 43, 44,
45, 46, 47.
Przykład:
~/.bashrc: PS1="\[\033[0;37;44m\u@\033[0;32;43m\h:\033[0;33;41m\w$\033[0m\]"
To daje nam bardzo kolorowy znak zachęty:
Aby wybróbować te ustawienia użyjemy export PS1="string",
później możemy przenieść je do .bashrc. Mój obecny znak
zachęty wygląda tak:
PS1="\[\033[1;34;40m[\033[1;31;40m\u@\h:\w\033[1;34;40m]\033[1;37;40m $\033[0;37;0m\] "
Właściwości Tekstu
Jak wcześniej wspominałem, '0' przed pierwszą sekwencją wyjściową
jest domyślnym ustawieniem koloru dla tekstu znaku zachęty
powłoki. Do właściwości tekstu następujące wartości mają
znaczenie: 0, 1, 22, 4, 24, 5, 25, 7, 27, które oznaczają:
domyślny, pogrubiony, niepogrubiony, podkreślony, niepodreślony,
mruganie, bez mrugania, inwersja, bez inwersji.
Za pomocą następującego skryptu powłoki możemy dostrzec różne
kombinacje kolorów.
#!/bin/sh
############################################################
# Nico Golde <nico(at)ngolde.de> Homepage: http://www.ngolde.de
# Last change: Mon Feb 16 16:24:41 CET 2004
############################################################
for attr in 0 1 4 5 7 ; do
echo "----------------------------------------------------------------"
printf "ESC[%s;Foreground;Background - \n" $attr
for fore in 30 31 32 33 34 35 36 37; do
for back in 40 41 42 43 44 45 46 47; do
printf '\033[%s;%s;%sm %02s;%02s ' $attr $fore $back $fore $back
done
printf '\n'
done
printf '\033[0m'
done
Skrypt ten może być ściągnięty w postaci tar.gz z:
showansicol.tar.gz
Inne Zastosowanie
Możliwość ustawiania kolorów powłoki nie jest wyłącznie
użyteczna do tworzenia ładniejszego znaku zachęty powłoki,
ale także może być użyteczny dla programów pisanych na konsolę
tekstową.
Do używania kolorów zastosowanie bibliotek takich jak slang,
lub ncurses byłoby potrzebne. Zwiększyłoby to jednak
wielkość pliku binarnego. Ncurses ma zaletę w byciu bardziej
lub mniej niezależne od rodzaju terminala.
Przykłady w C
'Hello World' na zielono:
#include <stdio.h>
int main(void){
const char *const green = "\033[0;40;32m";
const char *const normal = "\033[0m";
printf("%sHello World%s\n", green, normal);
return 0;
}
Inną użyteczną sekwencją wyjściową jest printf("\033[2J"),
ma ona ten sam efekt jak system(clear), lecz plik
nagłówkowy unistd.h może być wykluczony.
Z printf("\033[1K") możemy usunąć linię.
Przykłady dla skryptów inicjujących
Gdybyśmy chcieli mieć kolorowe, czytelne potwierdzenie pomyślnej
egzekucji skryptów inicjujących /etc/init.d to możemy
zamiast prostego '.' zastosować sekwencję wyjściową.
To jest wyciąg ze skryptu inicjującego cron:
#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0
case "$1" in
start) echo -n "Starting periodic command scheduler: cron"
start-stop-daemon --start --quiet --exec /usr/sbin/cron
echo "."
;;
Pomyślna egzekucja cron będzie symbolizowana kropką.
Kolorową odmianą tego byłoby zastosowanie [Ok] poprzez zmianę
ciągu echo, n.p.:
#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0
case "$1" in
start) echo -n "Starting periodic command scheduler: cron"
start-stop-daemon --start --quiet --exec /usr/sbin/cron
echo "\[ \033[1;34;40m[ \033[1;32;40mOk \033[1;34;40m]\033[0m\]"
;;
Zastosowanie tych zmian do wszystkich skryptów init jest
bardzo czasochłonne. Chyba, że użyjemy sekwencji wyjściowej \033,
gdyż Ctrl-v nie jest interpretowane jako znak.
Komentarze
Komentarze, krytykę, błędy, itp. proszę słać na "nico at
ngolde.de". Miłej zabawy...
Dyskusja dotycząca tego artykułu
Komentarze do dyskusji:
<--, powrót na stronę główną tego wydania
2004-07-07, generated by lfparser version 2.46