Zenity

Z Fedora Wiki
Skocz do: nawigacji, wyszukiwania

Spis treści

Zenity to program umożliwiający wyświetlanie okien dialogowych GTK+ bezpośrednio z poziomu terminala lub skryptów powłoki (źródło: wikipedia). W praktyce pozwala nadać przyjazny interfejs zwykłym skryptom, choć jego możliwości są mocno ograniczone. Podstawowe możliwości prezentuje sama dokumentacja library.gnome.org/users/zenity (en) i google, a tu bym chciał raczej zaprezentować coś praktycznego.
Tip.png
Zawsze na wierzchu?
Zenity w chwili obecnej nie ma możliwości ustawienia, aby okienko pojawiało się zawsze na wierzchu (funkcja ma się dopiero pojawić). Można to obejść zewnętrznym programem devilspie (jest w repo).

W tym celu należy utworzyć plik /home/użytkownik/.devilspie/zenity.ds o zawartości:

(if 
	(and
		(is (window_class) "Zenity")
		(is (application_name) "zenity")
	)
	(begin 
		(focus)
		(pin )
		(above)
	)
)
i z okienka poleceń (Alt+F2) lub terminala wydać komendę:
devilspie -d

Najlepiej dodać tę komendę do autostartu. Możliwość programu są ogromne, więc jeśli chcemy możemy dostosować ustawienia dla każdego okienka zenity z osobna.

sudo + zenity

Sudo pozwala łatwo wykonać program z prawami roota, ale wymaga konsoli do wpisania hasła. Jedynym obejściem wydaje się ustawienie "sudo bez hasła", co jednak jest głupotą od strony bezpieczeństwa. Okazuje się, że sudo może czytać hasło ze standardowego wejścia dzięki opcji -S(przez su - tego efektu nie uzyskasz) podane np. z okienka dialogowego zenity.

Najpierw potrzebujemy przestawić jeszcze jeden parametr sudo poza podstawową konfiguracją. Zaloguj się na konto roota i wpisz

visudo
Warn.png
Uwaga Vi!
Jeśli nadal nie potrafisz edytować niczego przy użyciu vi to najpierw poczytaj podstawy+vi

a następnie zahaszuj parametr "wymagaj konsoli"

# Defaults    requiretty

Teraz już wystarczy prosty skrypt.

#!/bin/bash
# zsudo - sudo z okienkiem zenity o hasło
# run:	zsudo polecenie
"zenity sudo""Podaj hasło dla sudo:""****""$@"

Nazwij go zsudo, nadaj prawa wykonywania chmod +x zsudo i przenieś do /usr/local/bin/zsudo.

Teraz już możesz bez terminala nacisnąć Alt+F2 i wpisać np zsudo yumex

sudo + zenity + nautilus-script

Tak przygotowany skrypt zsudo można wykorzystać do otwierania plików lub katalogów niczym program consolehelper. Jeśli masz GNOME możesz umieszczając skrypty w katalogu

$HOME/.gnome2/nautilus-scripts/

dodawać polecenia do menu kontekstowego pod prawym klawiszem myszy. Utwórz w powyższym katalogu skrypt o nazwie zsudo-open i wypełnij następująco:

#!/bin/bash
 
# do otwierania PLIKU
"gedit $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS"
 
# do otwierania KATALOGU nautilusem
#cmd="nautilus ${NAUTILUS_SCRIPT_CURRENT_URI##file://}"
 
# do otwierania KATALOGU w terminalu
#cmd="gnome-terminal ${NAUTILUS_SCRIPT_CURRENT_URI##file://}"
 
# DEBUG - odznacz by zobaczyć co tak naprawdę zawiera parametr $cmd
# echo "$cmd" | zenity --text-info
"$cmd"

Jak widzisz skrypt zawiera kilka przykładów polecenia, byś mógł dopasować do własnych potrzeb. Zawarłem też prostą opcję DEBUG.

zenity + cron

Wykonywaniem wszelkich cyklicznych operacji zajmuje się w systemie cron lub anacron (upewnij się, że ta usługa jest włączona). O jego obsłudze możesz poczytać w google, ja polecam Ci użyć graficznego programu gnome-schedule dostępnego w repo.

Problem pojawia się często przy uruchamianiu skryptu z poziomu cron. Należy ustawić dwie zmienne: $DISPLAY oraz $LANG. Pierwsza określa "gdzie" ma się wyświetlić okienko, druga kodowanie, które może powodować błędy w zenity. Inną ważną sprawą jest podawanie pełnych ścieżek do poleceń, bądź ustawienie zmiennej $PATH bezpośrednio w cron.

Wartości tych zmiennych możesz sprawdzić wpisując w konsoli

echo $DISPLAY

oraz

echo $LANG 

a w skrypcie ustawić ich eksport. Przykładowy skrypt budzik

#!/bin/bash
# budzik - powiadomienie z cron
"Czas na przerwę \n\n Ale to już!"

zenity + ikona na panelu

Tip.png
notify-send
Program notify-send z paczki libnotify pozwala dodatkowo uzyskać wyskakujące okienko z powiadomieniem.
Komunikaty uruchamiane w cron mogą pojawiać się subtelniej jako ikonka "obok zegarka" na panelu. Przykładowy skrypt (źródło) sprawdza procentową zajętość wybranej partycji i w razie przekroczenia parametru $THRESHOLD powiadamia nas o tym.
#!/bin/bash
# Komunikat o przekroczeniu ustalonej zajętość dysku
# źródło: http://www.cyberciti.biz/faq/mac-osx-unix-get-an-alert-when-my-disk-is-full/
# punkt montowania partycji
"/home"
# próg zajętości w %
${FS}${OUTPUT[11]}'s/%//'"warning""Partycja $FS zajęta w $CURRENT% Usuń kilka plików zanim zrobi się za ciasno."
Warn.png
Uwaga na wielokrotne uruchomienie!
Możesz dodać do cron uruchamianie skryptu co minutę, ale ten skrypt w żaden sposób nie sprawdza czy powiadomienie już istnieje, więc będzie powielał (dodawał kolejne ikonki do zasobnika) dopóki problem nie zostanie rozwiązany.

Jeśli chcemy mieć tylko 1 kopię danego programu możemy użyć do jego uruchomienia prostego triku sprawdzającego istnienie PID:

ps -C myprogram || { myprogram & }

PID skryptu można zobaczyć z poziomu samego skryptu wywołując w nim polecenie

echo $$

Istnieje w bash polecenie trap pozwalające przechwycić dowolny sygnał w skrypcie i stosownie go obsłużyć (przypomina obsługę przerwań). Lista sygnałów dostępna jest w pliku signal.h lub po wydaniu polecenia:

trap -l

a szczegóły

man 7 signal

nam potrzebny jest sygnał zakończenia. Bash dodaje pseudo sygnał EXIT, który jest równoważny do każdego prawdziwego sygnału zakończenia skryptu.

Cały skrypt dla crona ostatecznie może wyglądać tak: --> diskused

zenity + gxmessage

przykład: gman
Od wydania F12 można w repozytorium znaleźć aplikację gxmessage (w zamyśle stare xmessage z interfejsem GTK). Posiada tylko jeden rodzaj okienek, ale z większą ilością przycisków. Można użyć przy łataniu niedostatków zenity. Jako przykład czytnik stron man:--> gman
UWAGA: okienko gxmessage nie radzi sobie z wiadomością przekraczającą kilka tysięcy linii, dlatego zadziała dla krótkich stron man, ale próba odczytania strony np. bash zakończy się błędem.

Nautilus-Script: Edytuj dowiązanie

Skrypt nautilusa do edycji linku symbolicznego. Zazwyczaj dowiązanie można edytować jedynie z poziomu MC lub utworzyć link na nowo. Skrypt należy umieścić w katalogu /home/user/.gnome2/nautilus-scripts
Edytuj dowiązanie

Nautilus "przenieś do..." i "kopiuj do..." z paskiem postępu

Nautilusowi (GNOME) brakuje w menu pod prawym klawiszem myszy opcji typu Kopiuj do... oraz Przenieś do...
W sieci można znaleźć różne wersje tego skryptu. Oba skrypty są niemal identyczne oraz:

  • można je od razu użyć jako nautilus script lub nautilus actions
  • wyświetlają pulsujący pasek postępu z nazwą aktualnie kopiowanego/przenoszonego obiektu
  • wychwytują próbę nadpisania już istniejącego pliku/katalogu
  • można zaznaczyć wiele obiektów na raz
  • nie mają problemu ze spacjami w nazwach

Jak użyć "nautilus script" zostało opisane wyżej, natomiast by stworzyć "nautilus actions" należy najpierw zainstalować:

su -c'yum install nautilus-actions'

Aplikacja dostępna jest w menu System > Preferencje .... Jako parametr akcji wystarczy  %M dla tych tych skryptów.

Demon do aktualizacji systemu

Pomimo, że istnieje tego typu oprogramowanie w Fedorze, to w toku kolejnych usprawnień powiadomień o aktualizacjach zrobiłem całkiem zgrabny skrypt do aktualizacji. Właściwie wystarczy ustawić sobie ładną ikonkę w skrypcie (inaczej zenity ustawi jakąś domyślną). Skrypt dodajemy na końcu pliku /etc/rc.d/rc.local z ptaszkiem & (WAŻNE!) w postaci:

/usr/local/sbin/yum-zupdate &

domyślnie wykonywane jest polecenie yum check-update -q co pół godziny. Więcej co i jak przestawić w samym skrypcie yum-zupdate


Zachęcam do dodawania własnych rozwiązań z zenity

Osobiste
Przestrzenie nazw

Warianty
Działania
Wiki
Nawigacja
Inne
Narzędzia