Nawet BASH mówi ludzkim głosem

Wpis powstał po tym, jak skonfigurowałem sobie BASH-a, po długim "Googlaniu", próbach i błędach. Postanowiłem ułatwić życie potomności (; .

BASH, jak wiadomo, jest tzw. powłoką systemowa. To on wykonuje polecenia, które mu wydajemy… I to jego dzisiaj pomęczymy :) .

bashrc

Jak każdy program, tak i BASH posiada pewną konfiguracje, którą przechowuje w dwu plikach (w większości dystrybucji):

  • /etc/bashrc – posiadającym ustawienia powłoki dla każdego użytkownika;
  • ~/.bashrc (/home/użytkownik/.bashrc) – posiadającym ustawienia powłoki dla danego użytkownika.

W tym pliku możesz wiele zmienić, na przykład wyłączyć pewną funkcję w programie, stworzyć alias (polecenie lub ciąg poleceń wykonywanych gdy wpiszesz nazwę aliasu i ewentualne parametry), jak i skonfigurować powitania czy łańcuch znaków wyświetlany w miejscu, gdzie wpisujesz komendy ("znak zachęty")

Aliasy

Mogą być bardzo użyteczne. Na przykład polecenie ‘wysun’ (bez polskich znaków) może wysunąć tackę w napędzie ustawionym w aliase lub podanym po słowie ‘wysun’ (aliasy zrozumiesz po dłuższym czasie użytkowania terminala, a jakie aliasy będą Ci potrzebne, przekonasz się sam).

Przykład 1.

alias ls='ls -a'

Powyższy przykład spowoduje, że polecenie ls zawsze będzie uruchamiane z parametrem -a, gdyż nazwa aliasu jest taka sama, jak nazwa oryginalnego polecenia, a to zostanie "zastąpione" – oczywiście nie fizycznie, na dysku, a w konfiguracji powłoki.

Powitania

Wpisując w bashrc polecenie, zostanie ono wykonane za każdym razem, gdy uruchomisz terminal, czy będziesz się tekstowo logować.

Przykład 1.

echo 'miłej pracy (;'

Powyższy fragment kodu (polecenie echo, które wyświetla tekst z "argumentów" oraz sam tekst) dodany do konfiguracji, spowoduje, że BASH przywita Cię zdaniem:

miłej pracy (;

Przykład 2.

echo "mamy dzisiaj piękną datę - `date +'%d.%m.%Y'`"

Powyższy fragment (echo wyświetlające tekst i tekst zawierający wynik z polecenia date z "argumentami") spowoduje wyświetlenia:

mamy dzisiaj piękną datę – 14.07.2007

To "argumenty" decydują o formacie daty. Chcesz wiedzieć więcej?
date --help
oraz
man date wszystko Ci wyjaśnią.

"Znak zachęty"

Określa go zmienna PS1 .

Przykład 1.

export PS1='\u \A \w \$ '

A oto używane "kody specjalne":

\! - wyświetla numer polecenia historii,
\# - wyświetla numer aktualnego polecenia,
\$ - wyświetla # dla root`a i $ dla zwykłego użytkownika
\\ - wyświetla znak \
\d - wyświetla datę
\t - wyświetla czas
\h - wyświetla nazwę komputera
\n - przechodzi do nowego wiersza
\nnn - wyświetla znak, który odpowiada wartości ósemkowej nnn
\s - wyświetla nazwę powłoki
\u - wyświetla login użytkownika
\W - wyświetla podstawową nazwę bieżącego katalogu
\w - wyświetla bieżące położenie

 

Do znaku zachęty możesz dodać każdy znak, który uznasz za odpowiedni – to Twój terminal, niech on będzie taki, jak Ty chcesz :) .

Kolorowanie i ozdabianie tekstu w terminalu

Najlepsze zawsze na koniec :) . Terminal BASH jest o tyle nowoczesny, że korzysta z możliwości monitorów kolorowych i potrafi wyświetlać tekst w kolorze. Może Ci się to wydać absurdalne, jeśli nie widziałeś na oczy czarno-białego monitora, ale uwierz, kiedyś takich używano – nie znano koloru na monitorze.

W BASH-u kolory i inne właściwości tekstu określają kody (ciągle kody, same kody – to jak gra ;) ).

 

Kody i ich działanie

Kod Działanie
0 przywrócenie domyślnych właściwości
1 pogrubienie
2 rozjaśnienie koloru
4 podkreślenie
5 migotanie
7 odwrócone kolory
22 pogrubienie wyłączone
24 podkreślenie wyłączone
25 migotanie wyłączone
27 odwrócone kolory wyłączone
30 czarny tekst
31 czerwony tekst
32 zielony tekst
33 brązowy tekst
34 niebieski tekst
35 fioletowy tekst
36 turkusowy tekst
37 biały tekst (w palecie kolorów Tango!, w terminalu GNOME: szary)
38 podkreślenie, domyślny kolor tła
39 podkreślenie wyłączone, domyślny kolor tła
40 czarne tło
41 czerwone tło
42 zielone tło
43 brązowe tło
44 niebieskie tło
45 fioletowe tło
46 turkusowe tło
47 białe tło (w palecie kolorów Tango!, w terminalu GNOME: szare)
49 domyślny kolor tła

Kolory osadza się następująco:

  • Dla polecenia echo

    Należy wykonać polecenie z parametrem -e, a kod podawać w osobnych cudzysłowach przed tekstem (format kodu: \E[kodm a dla większej ilości \E[kod1;kod2m).

    Przykład 1.

    echo -e '\E[33m'"dzisiaj będzie"'\E[34m'"padać"'\E[0m'

    \E[33m ustawia brązowy kolor tekstu, \E[34m ustawia niebieski kolor tekstu, a \E[0m resetuje te ustawienia, by kolejne linie tekstu w terminalu wyglądały jak każde inne, a nie były niebieskie :) . To trochę jak XML - otwierasz, to i zamknij (obszar o danych właściwościach).

  • Dla zmiennej PS1

    Należy kod (format kodu: \e[kodm a dla większej ilości \e[kod1;kod2m) wkleić w zmiennej, bez dodatkowych cudzysłowów.

    Przykład 1.

    export PS1='\u, \e[33m[\e[31m⌚ \A\e[33m]\e[0m \e[34m\w\e[0m \$ '

    Przykład wygląda na skomplikowany przez dodane kolory, więc nie przejmuj się.

    Po kolei: \u to nazwa użytkownika, \e[33m ustawia kolor brązowy dla nawiasu kwadratowego [, \e[31m ustawia kolor czerwony dla daty i znaku Unicode przed nią (symbol zegarka, blok: różne techniczne), \e[33m ustawia kolor brązowy dla nawiasu kwadratowego ], \e[0m resetuje właściwości, \e[34m ustawia kolor niebieski dla aktualnego katalogu, a \e[0m znów resetuje właściwości, ale dla znaku $ / # (o tym wcześniej było) i kolejnych linii tekstu w terminalu.

Moja konfiguracja

Jako, że ten Jogger to mój dziennik, mam prawo pochwalić się osobistymi wycieczkami i danymi :]” src=”/files/snicker.png” class=”emots” /> .</p>
<pre><code lang=export PS1='\u, \e[33m[\e[31m⌚ \A\e[33m]\e[0m \e[34m\w\e[0m \$ ' B="`date +'%B'`" case "$B" in "styczeń") export mc='stycznia' ; "luty") export mc='lutego' ; "marzec") export mc='marca' ; "kwiecień") export mc='kwietnia' ; "maj") export mc='maja' ; "czerwiec") export mc='czerwca' ; "lipiec") export mc='lipca' ; "sierpień") export mc='sierpnia' ; "wrzesień") export mc='września' ; "październik") export mc='października' ; "listopad") export mc='listopada' ; "grudzień") export mc='grudnia' ; *) mc="`date +'%B'`"esac echo -e "witaj, "'\E[4;1m'"`whoami`"'\E[0m'". mamy dzisiaj "'\E[32m'"`date +'%A, %d '`"$mc'\E[0m'" i "'\E[34m'"pogodę jak za oknem"'\E[0m'"."echo 'miłego dnia (;'

Pierwsza linia kodu powoduje zmianę formatu znaku zachęty na dokładnie taki, jaki opisałem.
Druga linia ustawia wartość zmiennej B na nazwę aktualnego miesiąca.

Kolejne linie (case ÷ esac) używają wartości zmiennej B i w zależności od jej wartości ustawiają wartość zmiennej mc.

Przedostatnia, niezwykle długa linia, powoduje wyświetlenie następującego tekstu (aktualna data i godzina):

witaj, livio. mamy dzisiaj piątek, 13 lipca i pogodę jak za oknem.
miłego dnia (;

 

Linia zachęty wygląda tak:

livio, [⌚ 20:07] ~/Desktop $

Przydał Ci się ten wpis ? Możesz go wykopać lub dodać do zakładek w Twoim ulubionym serwisie.

This entry was posted in Ciekawostki and tagged , . Bookmark the permalink.

42 Responses to Nawet BASH mówi ludzkim głosem

  1. ciman says:

    Świetne. ;) Mój jest dużo skromniejszy, na starcie: "Witaj, Marcin!

    Dziś jest sobota, 14 lipca.", a znak zachęty to "[$katalog] > ". :)

  2. Livio says:

    Cieszę się, że mój wpis się przydał :) .

  3. Alvarus says:

    przed formatem miałem kolorowego basha.. teraz jak znajde czas to także sobie zrobie ;)

  4. avalan says:

    Jaka powłoka logowania? Bash jest powłoką systemową, a za logowanie odpowiada /bin/login :P

    Ja na zachętę proponuję:

    PS1=’\[\033[00m\][\[\033[01;34m\]\W\[\033[00m\]] ‘ ;)

  5. Livio says:

    Mniejsza o większość :P .

  6. avalan says:

    Ale to jest błąd nie do wybaczenia. To tak jak by nazwać psa kotem, albo królika zającem :D

  7. Minio says:

    Masz kilka błędów w ";Przykładzie 2":

    1. użyłeś apostrofów miast cudzysłowów, co spowoduje dosłowne odczytanie backticków i wydrukuje <<`date %d.%m.%Y`>>.

    2. format daty powinieneś poprzedzić plusem (date tego wymaga). Notabene skoro o nim mowa, bardziej niż "man date" pomocne będzie "man strftime".

    3. to zauważam także dalej — używasz backticków do zastępowania poleceniem. Tymczasem w bash-u przyjęło się wykonywanie tego przy pomocy zmiennej z nawiasem — "$(polecenie)". Zapis ten jest przede wszystkim bardziej widoczny, po drugie jest częściej używany — przyznam szczerze, że dopiero u Ciebie spotkałem się z zastosowaniem backticków, i — co dziwniejsze ;) — one działają.

    Idąc dalej, bash owszem, przechowuje konfigurację w dwóch (a nawet trzech) plikach, nie są to jednak /etc/bashrc i ~/.bashrc a bash_profile i bashrc (do tego dochodzi bash_logout do wykonywania poleceń przed zamyknięciem powłoki). Generalnie system powinien używać pliku konfiguracyjnego z katalogu domowego użytkownika, i odwoływac sie do globalnego pliku konfiguracyjnego w /etc/ w przypadku niesitnienia tego piewszego.

    Niemniej wpis z pewnością przyda się początkującym. Lista sekwencji sterowania basha-a zapewne nie tylko ;) — osobiście nie wiem nawet, w jakim manualu należałoby tego szukać.

  8. Livio says:

    1. Poprawione.

    2. Poprawione połowicznie (w man date i date –help jest opisane znaczenie wszystkich %x, więc nie potrzeba więcej mieszać).

    3. Wiem, że działają i są zapisem prostszym, moim zdaniem. Pierwszy raz spotykam się z $()… Chociaż, nie, ale nie podoba mi się ten zapis.

    4. Opisuję wyłącznie plik bashrc, więc nie chcę zawracać głowy innymi plikami.

    5. Odnośnie źródeł – nie chciałem tego wypisywać, bo głównie manuale byłby nimi ;) .

  9. dawid says:

    Super wpis!

    Ten tutorial naprawdę mi się przydał.

  10. Livio says:

    Dziękuję za pozytywne słowa :) . Cieszę się, że Ci się przydał :) . Wpadnij za jakiś czas (nowe wpisy są co dwa dni), może coś jeszcze Ci się przyda ;) .

  11. dawid says:

    Nie omieszkam zaglądać tu co jakiś czas. Dodałem sobie tego bloga do zakładek ;)

    Pozdrawiam

  12. Livio says:

    Cieszę się :) . Życzę miłego dnia (; .

  13. Minio says:

    *avalan*:

    "powłoka logowania" nie jest programem, który odpowiada za możliwość zalogowania użytkownika a jego domyślną powłoką (czy koniecznie ";powłoką"?), ustawioną w /etc/passwd.

    *Livio*:

    Zobacz sobie dowolny skrypt napisany w bash-u — zobaczysz, że zastępowanie poleceniem jest zapisywane "$()" ;) . Za stosowaniem tego zapisu przemawia równiez fakt, że vim (pewnie nie tylko)odpowiednio go zinterpretuje (i zmieni kolor) jako element składni. Backticka nie.

    Niemniej nie jest moim celem przekownywanie Cię do zejścia na jedyną słuszną drogę — dobrze wiem, jak silne jest przyzwyczajenie.

  14. Livio says:

    Minio, właśnie się przyzwyczaiłem do tych pod-tyldowych znaczków – backticków (; .

  15. Minio says:

    *Livio*: Domyśliłem się :) .

  16. Walker says:

    A ja jednak kocham zwykłą, czarno-szarą konsole bez żadnych dodatków. (Oczywiście przezroczystość musi być ;). )

  17. Livio says:

    Ja lubię kolorki, normalny tekst o kolorze czarnym, białe pół-przezroczyste tło i jest fajnie :) .

  18. kaśka says:

    A mój wygląda tak: http://kaska.jogger.pl/2006/10/25/w-domu/ :P

    Oczywiście to, co wypluwa ls, grep też się koloruje.

  19. Livio says:

    Wszystko dzięki aliasom ;) .

  20. Livio says:

    Tymczasem dopieszczam wygenerowany zestaw ikon. Podmieniam odpowiednio ikony, by tam, gdzie trzeba – była ikona Fedory, a tam, gdzie trzeba – GNOME. Podmieniłem już kosz na kosz z logo recyklingu Foxtrot, ikonki katalogu domowego i strony domowej na domek z ikon GNOME, ikonkę archiwum na te z Gion oraz ikonki deb-ów i rpm-ów na ikonkę Synaptica z GNOME. Będzie ślicznie. Może dzisiaj zaktualizuję zestaw ikon Livious :] .

  21. kaśka says:

    Powodzenia. Kiedyś się też tak bawiłam, ale teraz używam terminala i co najwyżej mc, a na pulpicie mam tylko pagery [E16] i iconbox dla okienek zminimalizowanych, posługuję się sktórami klawiszowymi i zbudowanymi przez siebie i dla mnie chyba tylko wygodnymi menu. Za to w ~/ – śmietniiiik!…

  22. Livio says:

    Ja mam pedantyczny porządek w ~ tylko w / jest bałagan, bo pakiety dla Ubuntu są budowane… Byle jak. Używam GNOME, bo lubię GTK i aplikacje, które oferują to, czego potrzebuję :) .

  23. D4rky says:

    echo "

    `fortune -a`

    "

    a tak wyglada moj .bashrc ;)

  24. Livio says:

    Nie lubię fortunek, bo zawsze musiałem usuwać angielskie fortuny z /usr/games/fortune (chyba ten katalog) i pobierać z repozytorium polskie fortunki.

  25. Minio says:

    Wyświetlanie losowego tekstu przy starcie powłoki jest fajne. Ja sobie napisałem malutki skrypt w Perlu i korzystam z własnego, na bieżąco uaktualnianego pliku z fortunami ;) .

  26. Livio says:

    Kiedyś w PHP sobie napisałem skrypcik, który na stronie wyświetlał losowy slogan :P .

  27. Pakos says:

    No niezłe, z tym tekstem na tart to nigdy nie pomyślałem :)

    Troszkę przerobiłem dla swoich potrzeb :P

  28. Livio says:

    Pakos, po to napisałem, byś mógł sobie ";poprzerabiać" (; .

  29. Pakos says:

    orly? :p

    tak myślałem ;)

    Mam jeszcze ochotę na pokolorowanie innych rzeczy, prompt i to coś to troche mało ale jakos nie mam czasu narazie :P

  30. Livio says:

    Wiem, jaka jest rożnica, między $() a „ – jeśli mamy to w bashrc, to bash zaraz po swoim uruchomieniu, w przypadku $() uruchomi te komendy, a w przypadku „ – gdy będzie do nich odwołanie (wykonanie komendy z aliasu, funkcji, etc).

  31. Morfi says:

    hmmm ja jakoś nie mam takiego zapędu, aby mieć kolorowo w konsoli. Dla mnie najważniejsze jest to, bym na każdym komputerze widział to samo. Dlatego wolę sobie np. wpisać te kilka znaków więcej i pamiętać komendę na zawsze, niż porobić sobie aliasy, a potem idę naprawiać jakiś serwerek, wpisuję jakieś polecenie, które u mnie jest aliasem, a tam :

    bash: command not found

  32. ciman says:

    W Twoim przypadku masz rację, ale nie każdy majstruje przy innych komputerach. :p

  33. pool631 says:

    Jakbys mogl to napisz pool621@chrome.pl
    Chcialem sie dowiedziec jak pokolorwac konsole, tak aby byla czarna i wszystkie zielone napiszy ;)

    Pozdrawiam

  34. Livio says:

    Ale tutaj jest wszystko opisane.

  35. dawid says:

    Mam takie pytanko. Pokolorowałem sobie prompta i wszystko pięknie wygląda z wyjątkiem jednej rzeczy. Mianowicie gdy loguję się poprzez ssh, kolorowania nie ma. Można jakoś to zmienić?

    pozdrawiam

  36. Livio says:

    Łączysz się ze zdalnym terminalem – uruchamiasz terminal na zdalnym komputerze, a kontrolujesz na własnym. Stąd brak kolorowania.

    Jeśli Twój shell używa basha, możesz spróbować wrzucić plik .bashrc do swojego katalogu domowego (~), ale nie gwarantuję Ci działania, bo nie wiem, czy dostęp do zdalnego katalogu domowego masz i czy Twój shell używa basha.

  37. dawid says:

    Nie wiem czy się dobrze rozumiemy. Na swoim komputerze mam użytkownika ‘dawid’ i na nim kolorowanie działa. Przez ssh łącze się ze swoim komputerem i loguję również jako użytkownik ‘dawid’. I tu kolorowania już nie ma.

  38. Livio says:

    To chyba Ty nie rozumiesz. Użytkownik lokalny a zdalny to nie to samo, choćbyś się nazywał tak samo w obydwu miejscach. Przeczytaj jeszcze raz mój komentarz, to zrozumiesz, dlaczego.

    A jeśli nie, powiem. Plik lokalny nie jest respektowany, ani nawet widziany przez program zdalny.

  39. Gregis says:

    świetny text .. właśnie tego szukałem ….

  40. Livio says:

    Zapomniałem nawet, że to ja napisałem ^^ .

    Cieszę się, że Ci się (podoba) przydał :) .

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>