12:23
BASH - Znak zachęty Powłoki
BASH należy do jednych z najpopularniejszych powłok w systemach UNIX'owych. Zna ją prawdopodobnie każdy użytkownik Linuksa. Nazwa BASH pochodzi od Bourne-Again SHell i stanowi część projektu GNU. Pierwsze wersje powłoki zostały napisane przez Brian'a Fox'a w 1987.
Znak zachęty
Znak zachęty może być pojedynczym znakiem, lub ich ciągiem. Informuje on o gotowości przyjmowania poleceń przez system operacyjny. W zależności od używanej terminala, oraz od jego konfiguracji może on zawierać różne informacje. Najczęściej wyświetla ścieżkę, bądź nazwę aktualnego katalogu. Przechowywane mogą być w nim również inne informacje, jak nazwa komputera, domeny, zalogowanego użytkownika, aktualny czas i datę, czy po prostu nazwę używanej powłoki.
Zachęta w powłoce BASH
W powłoce BASH standardowy znak zachęty przechowywany jest w zmiennej PS1. Zaraz po zalogowaniu się widzimy już jaką przyjął wartość. Widzimy jednak tylko znaki drukowane, wypisane przez powłokę na podstawie danych zawartych w zmiennej. Aby zobaczyć jak zbudowany jest znak zachęty, wystarczy wypisać zmienną PS1:
echo $PS1
lub
set | grep PS1
Standardowo, zaraz po skompilowaniu powłoki BASH jako znak zachęty będzie widniała informacja o nazwie używanej powłoki, oraz jej wersji (zawartość zmiennej PS1 to s-v$):
bash-3.1$
Aby zmienić znak zachęty wystarczy przypisać do zmiennej PS1 inną zawartość:
PS1="Nowy znak zachety> "
Powłoka BASH posiada również wtórny znak zachęty. Wyświetlany jest gdy do wykonania polecenia potrzebne są dodatkowe dane z wejścia w celu uzupełnienia podstawowej komendy. Wtórny znak zachęty przechowywany jest w zmiennej PS2.
Znaki specjalne
Wewnątrz zmiennej znaku zachęty mogą znajdować się znaki specjalne. Wszystkie znaki specjalne poprzedzone są symbolem ''.
a- znak dzwonka ASCII (07)d- data w formacie 'DzienTygodnia Miesiąc Dzień' np: "Tue May 26"e- znak escape ASCII (033)h- nazwa hosta do pierwszej kropkiH- nazwa hostaj- liczba zadań aktualnie obsługiwanych przez powłokęl- główna część nazwy urządzenia powłokin- znak nowej liniir- powrót karetkis- nazwa powłokit- aktualny czas w formacie 24h GG:MM:SST- aktualny czas w formacie 12h GG:MM:SS@- aktualny czas w formacie 12h GG:MMA- aktualny czas w formacie 24h GG:MMu- nazwa aktualnie zalogowanego użytkownikav- wersja powłoki BASH (np. 3.1)V- wersja powłoki BASH (np. 3.1.17)w- ścieżka aktualnego kataloguW- nazwa aktualnego katalogu!- numer polecenia w historii BASH#- numer polecenia$- jeżeli UID jest 0 wyświetla # w przeciwnym wypadku $nnn- znak odpowiadający szesnastkowej liczbie nnn- - symbol ''
[- początek sekwencji znaków niedrukowalnych]- koniec sekwencji znaków niedrukowalnych
Przypisywanie znaku zachęty
Wspomniałem wcześniej, jak można przypisać do zmiennej PS1 ciąg znaków, aby uzyskać nowy znak zachęty. Wpisane w ten sposób ciągi znaków do zmiennej będą pamiętane tylko w obrębie aktualnie działającego terminala. Aby zmiany były pamiętane dla każdego uruchomionego terminala zaraz po zalogowaniu się, należy ustawić tą zmienną w pliku .bashrc znajdującego się w katalogu domowym każdego użytkownika. W przypadku braku pliku należy go utworzyć.
Kolorowy znak zachęty
Powłoka BASH umożliwia nadawanie pewnym obszarom znaku zachęty pewnych kolorów. Wybór kolorów nie jest duży (zaledwie 16), ale zastosowanie dobrze dobranych kolorów zwiększy czytelność informacji znajdujących się w znaku zachęty.
- \[\033[0m\] - brak formatowania
- \[\033[1;30m\] - szary
- \[\033[0;30m\] - czarny
- \[\033[0;31m\] - czerwony
- \[\033[1;31m\] - jasny czerwony
- \[\033[0;32m\] - zielony
- \[\033[1;32m\] - jasny zielony
- \[\033[0;33m\] - brązowy
- \[\033[1;33m\] - żółty
- \[\033[0;34m\] - niebieski
- \[\033[1;34m\] - jasny niebieski
- \[\033[0;35m\] - fioletowy
- \[\033[1;35m\] - purpurowy
- \[\033[0;36m\] - cyjan
- \[\033[1;36m\] - morski
- \[\033[0;37m\] - siwy
- \[\033[1;37m\] - biały
Kolory, gdzie przed średnikiem znajduje się jedynka, przez terminale obsługujące obsługujące czcionkę pogrubioną będą wyświetlane jako pogrubione. W tym wypadku niektóre terminale mogą interpretować te kolory nie jako rozjaśnione/przyciemnione, a po prostu pogrubione.
Przykładowe formatowania znaku zachęty:
PS1="\u@\h \w \$ "PS1="\u:\W \$ "PS1="\[\033[1;32m\][\t] \[\033[0;36m\]\w \$ \[\033[0m\] "PS1="\[\033[1;36m\][\A \d] \[\033[0;37m\]\W \$ \[\033[0m\] "PS1="\[\033[1;34m\][\u] \[\033[0;35m\]\w \$ \[\033[0m\] "PS1="\[\033[1;30m\]\u\[\033[1;31m\](\w)\$ \[\033[0m\] "PS1="\[\033[0;33m\]\!: \[\033[0m\] "PS1="\[\033[0;36m\]\w \[\033[0;37m\]\#\$ \[\033[0m\] "PS1="\[\033[0;31m\]\t -\[\033[0;33m\] \w \[\033[0;37m\]\$ \[\033[0m\] "PS1="\[\033[0;37m\](\#)\[\033[01;33m\]\u@\h\[\033[0;36m\] \w \$\[\033[00m\] "
Wyniki:


13:32
Xfce i klawiatura multimedialna
Aby umożliwić korzystanie z dodatkowych klawiszy funkcyjnych nie jest wymagane żadne dodatkowe oprogramowanie. Oczywiście wykorzystanie dodatkowych aplikacji pomoże w osiągnięciu pewnych efektów wizualnych, których jednak nie każdy będzie potrzebować.
Kod klawisza
W pierwszej kolejności musimy się dowiedzieć, jaki klawisz został wciśnięty przez użytkownika. Do tego celu poszczególnym akcjom, jakie będziemy chcieli obsłużyć musimy przypisać kod klawisza. Jednym ze sposobów uzyskania takiej informacji jest użycie programu xev. Po wpisaniu w konsoli tego polecenia otrzymamy okienko, nad którym przeprowadzamy testy. Wciskając odpowiednie klawisze, czy zestawy klawiszy, otrzymamy odnośnie ich informacje:
KeyRelease event, serial 31, synthetic NO, window 0x3800001, root 0x5d, subw 0x0, time 1103643055, (-139,-2), root:(412,316), state 0x0, keycode 223 (keysym 0x0, NoSymbol), same_screen YES, XLookupString gives 0 bytes: XFilterEvent returns: False
Z tych danych możemy odczytać, że kod naszego klawisza posiada przykładowo numer 223.
Przypisywanie symboli
Kolejnym krokiem jest przypisanie kodu klawisza, do jego symbolu na serwerze Xów. Aby zobaczyć listę wszystkich dodatkowych obsługiwanych symbolów wystarczy podejrzeć plik:
cat /usr/share/X11/XKeysymDB
Następnie dopisujemy kod klawisza oraz jego symbol do pliku .Xmodmap w katalogu domowym użytkownika:
echo "keycode 176 = XF86AudioRaiseVolume" >> ~/.Xmodmap
Każdy dopisany kod klawisza powinien znaleźć się w osobnej linii. Następnie musimy zrestartować Xy.
Aby połączyć symbol naciskanego klawisza z Xfce przechodzimy do ustawień klawiatury w panelu Xfce a następnie do zakładki 'Skróty'. Po utworzeniu nowego schematu (na domyślnym nie można dodawać własnych skrótów) dodajemy nowe polecenie oraz przyciskamy wybrany klawisz, aby przypisać mu wybraną akcję.
Przykład obsługi głośności
Obsługa głośności za pomocą klawiatury jest jedyn z najpopularniejszych ustawień dodatkowych klawiszy szczególnie wśród użytkowników laptopów. Klawisze do obsługi głośności mają numery: 160, 174, 176. Dopisujemy więc do pliku ~/.Xmodmap wiersze:
keycode 176 = XF86AudioRaiseVolume keycode 174 = XF86AudioLowerVolume keycode 160 = XF86AudioMute
Aby zmienić poziomy głośności wykorzystam program aumix (http://jpj.net/~trevor/aumix.html). Domyślnie wykorzystuje on urządzenie miksujące /dev/mixer, dlatego jeżeli jesteśmy użytkownikami systemu ALSA w jądrze trzeba wkompilować Device Drivers -> Sound -> Advanced Linux Sound Architecture -> OSS Mixer API. Dodatkowo, do wyświetlenia paska poziomu głośności na pulpicie użyję programu Xosd (https://sourceforge.net/projects/libxosd/). Po skompilowaniu obu programów najlepiej przygotować skrypt, który pozwoli łatwe przekazywanie parametrów wykonywanej operacji. W przypadku mojego skryptu wywołanie akcji wygląda następująco:
- volume up - zwiększenie głośności o 5% (aumix -v+5)
- volume down - zmniejszenie głośności o 5% (aumix -v-5)
- volume mute - wyciszenie dźwięku, lub jego przywrócenie, jeśli jest wyciszony (aumix -v0 lub aumix -v???)
Takie właśnie polecenia wraz ze ścieżką do skryptu należy wpisać w skrótach klawiatury w Xfce. Do wyświetlenia prezentacji graficznej poziomu głośności użyjemy polecenia osd_cat w następującej formie:
osd_cat -c green -s 1 -d 1 -b percentage -f "-Misc-Fixed-Bold-R-Normal--18-120-100-100-C-90-*-*" -A center -p middle -P `aumix -q | grep vol | cut -c5-7` &
Efektem polecenia będzie zielony pasek procentowo wyświetlający poziom głośności:
![]()
Aby można było przywrócić poziom głośności po wyciszeniu musimy gdzieś go zapamiętać. W swoim skrypcie posłużyłem się plikiem tymczasowym w katalogu /tmp, ale równie dobrze można zapamiętać ten poziom w jakiejś zmiennej systemowej.
Poniżej kod skryptu, który można pobrać jako cały plik ze stopki artykułu.
#!/bin/sh
if [ $1 ]; then
if [ $1 == "up" ]
then
aumix -v+5
fi
if [ $1 == "down" ]
then
aumix -v-5
fi
if [ $1 == "mute" ]
then
if [ `aumix -q | grep vol | cut -c5-7` == "0," ]
then
aumix -v`cat /tmp/sound_lvl`
else
aumix -q | grep vol | cut -c5-7 >> /tmp/sound_lvl
aumix -v0
fi
fi
osd_cat -c green -s 1 -d 1 -b percentage
-f "-Misc-Fixed-Bold-R -Normal--18-120-100-100-C-90-*-*"
-A center -p middle -P `aumix -q | grep vol | cut -c5-7` &
else
echo "Usage:"
echo " volume up"
echo " volume down"
echo " volume mute"
fi

English
Nazywam się Tomasz Chudyk i witam na mojej stronie. Z zawodu jestem programistą. Moje zainteresowania krążą głównie wokół open-source, Linuksa i technologi internetowych.
