Środowisko graficzne Gnome posiada wiele atrakcyjnych funkcji, które często nie są przez administratorów wykorzystywane. Jedną z nich jest dołączony zestaw form dialogowych o nazwie Zenity ( http://library.gnome.org/users/zenity/stable/ ). Formy dialogowe Zenity mogą (i powinny) być używane w celu ułatwienia użytkownikom oraz administratorom i operatorom systemu wykorzystywania skryptów powłokowych. Formy Zenity umożliwiają przekazywanie informacji do i ze skryptów przy użyciu intuicyjnych mechanizmów środowiska graficznego. Najprostszą funkcją, które można zrealizować za pomocą form Zenity jest funkcja informowania użytkownika. Do wyświetlania informacji służą następujące formy dialogowe: Info: Forma dialogowa wyświetlająca przygotowany wcześniej komunikat: zenity --info text="kopiowanie zakończone." Informacja będzie wyświetlana do czasu naciśnięcia myszką przycisku OK. Dalsze wykonywanie (lub zakończenie) skryptu, z którego wywołano formę informacyjną zostanie wstrzymane do czasu naciśnięcia OK. Forma informacyjna nie jest przeznaczona do przekazywania danych do skryptu. Question: Forma wymuszająca odpowiedź na dowolne pytanie: zenity --question --text="czy na pewno chcesz kontynuować?" Forma pytanie kończy swoje działanie po wybraniu Anuluj lub OK. W przypadku Strona 1 z 9
naciśnięcia przycisku OK kodem wyjścia formy jest 0, zaś jeśli naciśniemy Anuluj forma zakończy działanie z kodem 1. Kod wyjścia znajdzie się w specjalnej zmiennej powłokowej $?: zenity --question --text="czy na pewno chcesz kontynuować?";echo $? W zależności od tego, jaki przycisk naciśniemy myszką w oknie terminala, z którego wywołaliśmy formę pojawi się 0 lub 1 : Warning: Forma tak jest bardziej zbliżona do formy Info niż do formy Question : zenity --warning --text="czy na pewno chcesz kontynuować?" Strona 2 z 9
Error: Ostatnią formą informacyjną jest forma przeznaczona do sygnalizacji błędu: zenity --error jeśli nie wprowadzimy własnego tekstu zostanie wyświetlona informacja standardowa: Notification: Forma różniąca się od pozostałych form informacyjnych nie powoduje ona wyświetlenia nowego okna, lecz dodaje ikonkę (aktywator) na panelu Gnome. Ikonę aktywatora można wybrać w taki sposób, aby sugerowała ona rodzaj informacji. Jeśli naprowadzimy kursor myszki na ikonkę wyświetlony zostanie dymek z treścią podaną w opcji text : zenity --notification --window-icon="info" --text="coś trzeba zrobić" #1 zenity --notification --window-icon="warning" --text="nie rób tego" #2 1 2 Jeśli naciśniemy ikonkę na pasku forma Notification zakończy pracę z kodem wyjścia 0, co umożliwi kontynuowanie skryptu, którego została wywołana forma Notification. Strona 3 z 9
Progress (pasek postępu): Forma dialogowa umożliwiająca wyświetlania okna z paskiem postępu. Musi ona współpracować ze skryptem powłokowym. Współpraca jest realizowana w następujący sposób: #!/bin/sh ( echo "10" ; sleep 1 echo "# Pobieranie plików uaktualnienia" ; sleep 1 echo "20" ; sleep 2 echo "# Tworzenie katalogów" ; sleep 1 echo "50" ; sleep 1 echo "Usuwanie poprzedniej wersji" ; sleep 1 echo "75" ; sleep 3 echo "# Start usług" ; sleep 1 echo "100" ; sleep 1 ) zenity --progress \ --title="uaktualnianie oprogramowania" \ --text="sprawdzanie wersji..." \ --percentage=0 if [ "$?" = -1 ] ; then zenity --error \ --text="błąd uaktualnienia. Koniec." fi Jak widać z analizy powyższego skryptu zenity czyta dane ze standardowego wejścia linia po linii. Jeśli linia rozpoczyna się od znaku # to następujący po tym znaku tekst jest przejmowany do wyświetlenia (nad paskiem postępu). Jeśli linia zawiera jedynie liczbę to zostanie wyświetlony pasek postępu o długości (w procentach) określonej przez tą liczbę. Taka obsługa paska postępu pozwala na wstawianie punktów kontrolnych w określenie etapu, na jakim program się znajduje. Oczywiście w miejsce polecań sleep należy wstawić odpowiednie procedury realizujące kolejne etapy działań (w tym przypadku uaktualnienia programu). Strona 4 z 9
Text Entry wprowadzenie danej: Forma dialogowa umożliwiająca wprowadzenie danej tekstowej do skryptu. Zenity otwiera okno zawierające zdefiniowany tekst oraz pole umożliwiające wprowadzanie znaków w klawiatury: Wprowadzona dana jest traktowana jako tekst i przekazywana na standardowe wyjście. Dana może być podstawiona do zmiennej: [tomekb@main ~]$ ZMIENNA=`zenity --entry --text="wprowadż daną:"` [tomekb@main ~]$ echo $ZMIENNA 123 Wprowadzanie danej można utajnić wykorzystując opcję --hide-text: Strona 5 z 9
List wybór elementu z listy: Forma list wyświetla listę elementów ułożonych wierszach zawierających kolumny. W przykładowym skrypcie pierwsza kolumna zawiera przełączniki radio box (oznaczony jako TRUE określa działanie domyślne), druga funkcję, a trzecia opis tej funkcji. Po dokonaniu wyboru i naciśnięciu przycisku OK na standardowe wyjście zostanie wysłana zawartość pierwszej opisanej kolumny i forma zakończy pracę z kodem wyjścia 0. W przypadku naciśnięcia przycisku Anuluj forma zakończy pracę z kodem wyjścia 1 : #!/bin/sh zenity --list \ --title="wybierz funkcję": \ --radiolist \ --column="wybór" --column="nazwa" --column="opis" \ TRUE Usu "Usuń plik" \ FALSE Przenie "Przenieś plik" \ FALSE Skompresuj "Zarchiwizuj plik" Użycie formy List nie odbiega praktycznie niczym od formy Text Entry. Strona 6 z 9
File Selection: Bardzo przydatną formą dialogową jest File Selection: Wyświetla ona listę plików i podkatalogów w bieżącym katalogu umożliwiając dokonanie wyboru. Jeżeli wybierzemy podkatalog, to wówczas zostanie wyświetlona jego zawartość, zaś jeśli wybranym obiektem będzie plik jego nazwa wraz z pełną ścieżką zostanie przekazana na standardowe wyjście: [tomekb@main ~]$ zenity --file-selection /home/tomekb/.thunderbird/appreg [tomekb@main ~]$ Strona 7 z 9
Kalendarz: Forma dialogowa umożliwiająca wybór daty: zenity calendar Forma wyświetla kalendarz z zaznaczoną aktualną datą. Za pomocą myszki można wybrać dowolną datę. Po naciśnięciu przycisku OK zaznaczona data jest przekazywana na standardowe wyjście: [tomekb@main ~]$ zenity --calendar 28.01.2012 Format przekazywanej daty można wybrać za pomocą opcji --date-format. Musi on odpowiadać wymaganiom funkcji strftime, na przykład: %A %d/%m/%y. Strona 8 z 9
Uwagi końcowe: Opcje ogólne (akceptowane przez wszystkie formy dialogowe zenity): --title=tytuł --window-icon=ścieżka_do_ikony --width=szerokość_okna --height=wysokość_okna --timeout=czas_otwarcia_okna zenity --about wyświetla informacja o zenity: Wyświetlona forma dialogowa pozwala także uzyskać dostęp do informacji licencyjnych (GPL2) oraz do kontekstowego systemu pomocy (w języku angielskim). Kody wyjścia: 0 program zakończony sukcesem (użytkownik nacisnął OK lub Close), 1 opuszczenie programu (użytkownik nacisnął Cancel lub zamknął okno formy dialogowej), -1 nieokreślony błąd, 5 zamknięcie programu w wyniku osiągnięcia czasu określonego w opcji timeout. Analizując skrypty należy zwrócić uwagę na znak \ zabraniający interpretacji końca linii. W łańcuchach tekstowych nie należy używać znaku! Strona 9 z 9