Kolorowe Powłoki -- Używanie kolorowych sekwencji wyjścia ANSI

ArticleCategory: Hardware

SystemAdministration

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in de Nico Golde

de to en Jürgen Pohl

en to pl B.J.F. Stobiecki

AboutTheAuthor:[A small biography about the author]

Obecnie Nico jest wciąż uczniem. Od kilku lat zajmuje się z determinacją Linuksem, uczestniczy także w kilku projektach Open Source.

Abstract:

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.

ArticleIllustration:

ansi colors

ArticleBody:

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:
nico@ebrain:~$

\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:
nico@ ebrain: ~$

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\] "

[ nico@ebrain:~ ]

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...