Skriptování jako o život (GUI ve skriptech)

Skriptujeme GUIPro mě je Linux v neposlední řadě také změť skriptů, které činí moje používání pohodlnějším, od přehazování ploch, pro informování o zálohách, přes počítání kdovíčeho, až po „Matrix“ v terminálu. V dnešním článku bych chtěl představit pár nástrojů zaměřených na grafické prostředí, které vám mohou usnadnit život, nebo vás jenom na pár minut zabavit.

 

 

Xdotool

xdotool – nástroj v příkazové řádce pro automatizaci X11
Podle mě nejzajímavější nástroj, který si dnes ukážeme, je v repozotáři, snad ho zvládnete nainstalovat:

Příkaz terminálu:
sudo apt-get install xdotool

 

Správa pracovních ploch a otevřených oken

Aktuální pracovní plochu získáme přes příkaz „xdotool get_desktop“. Pracovní plochy jsou indexovány od 0 (takový programátorský (zlo)zvyk, že nula je „první“). S touto informací můžeme nakládat v dalších skriptech. Například pro použití příkazu „xdotool set_desktop x“, který nastaví aktivní pracovní plochu na plochu s číslem x. Počty pracovních ploch určuje příkaz „set_num_desktops“, a zjistíme ho pomocí „get_num_desktops“.

Okna v grafickém serveru X11 mají přidělována čísla, jak zjistit číslo? Postačí nám příkaz „xdotool getmouselocation“, který řekne polohu myši a zároveň na kterém okně se nachází. Nebo příkaz „xdotool getactivewindow“, který, jak překlad napovídá, nabízí informaci o tom, které okno (číselně) je aktuálně aktivní. Informaci o jménu okna získáme pomocí příkazu „xdotool getwindowname“. Prohledávání oken také dobře obstarává příkaz „xdotool search –name <název_okna>“, tento pro změnu zjistí všechna okna, která v názvu obsahují řetězec <název_okna>. Zkuste i další kritéria hledání.
Přesunutí okna po plochách je snadné, příkaz „xdotool set_desktop_for_window <číslo_okna> <číslo_plochy>“, intuitivně zjištění na které ploše okno je „xdotool get_desktop_for_window <číslo_okna>“.

Někdy může okno zůstat viset a my nevíme, po kterém procesu přesně budeme uklízet, v tuto situaci užijeme příkaz „xdotool getwindowpid <číslo_okna>“, který se shoduje s pid v „ps -e“. Tento proces bude mít spuštěné okno, na jehož číslo odkazujete.

 

Zjednodušme si xdotool skriptování

Doporučuji nastudovat podle manuálu xdotool search (man xdotool), protože na základě selekce okna můžeme velmi efektivně provádět další operace. Zde je příklad pro přenesení okna, ve kterém píši článek, do popředí. Okno identifikuji jako „článek.odt“ (edituji tento soubor).

xdotool search --name článek.odt windowactivate %1
Jak vidíte, příkazy se mohou řetězit, ale jak to tedy přesně funguje? Search na základě parametrů (odkazuji znovu na man xdotool) ukládá výsledky do „WINDOWSTACKU“, což je paměť pro nalezená okna. Nalezené výsledky můžeme v instanci programu vyvolat pomocí %n, kde n je pozice v stacku (výchozí je 1 a zároveň i nejmenší), chceme-li operaci provést pro všechny nalezené výsledky, je třeba použít %@ a tak předat celý stack.
xdotool je opravdu komplexní nástroj a stojí za to mu obětovat pár minut našeho života, tak s chutí na něj. Pro zájemce tu dávám skript, který jsem kdysi dávno nahrál pro někoho, jedná se o přeskočení na nastavenou plochu a zpátky … Skript byl motivací pro napsání článku, tedy ho klidně zlepšete a používejte ke své spokojenosti a prospěchu… (byl namapovaný na hot corner).

 

Interakce s uživatelem

Pokud píšeme rozsáhlejší skript můžeme chtít uživatele informovat, nebo žádat o informace, které potřebujeme k dokončení skriptu.

 

Notify-send, elegantní metoda k sdělení informace

Notify-send je velmi jednoduchý nástroj k vyvolání informace v grafickém rozhraní. Její volání je pomocí „notify-send <zpráva>“. Příkladem budiž skript, jež sdělí uživateli, kolik je hodin a jeho login. Informaci o jméně nese systémová proměnná $USERNAME a jak formátovat datum je obsaženo v man date. Připomínám, že \“ escapování dvojitých uvozovek tak, aby byli vypsány při zobrazení.
notify-send „Ahoj uživateli \“$USERNAME\“, je právě `date +“%H:%M“`“
Notify-send podporuje také úrovně „kritičnosti“ sdělení (podívejte se do man notify-send na přepínač -u).

 

Zenity, reálná interakce s uživatelem

Zenity je knihovna, která nabízí interakci mezi shellem a GTK dialogy, tedy je vhodná pro grafická prostředí založená na GTK, tedy Gnome, MATE, Cinnamon, atd. a kvůli závislostem není vhodná pro KDE, zde odkáži na knihovnu kdialog (odkaz v angličtině). Ubuntu a Mint ho mají ve výchozí instalaci, případně je ve standartních repozitářích.
Nejlepší je si ke všemu přečíst manuál „man zenity“. Pro inspiraci tu uvedu pár příkladů na nějaké typické dialogy. Například takovýto dialog vás nepotěší, pokud máte „chytrý sklep“, co hlásí počty potravin na váš systém.

zenity --warning --text="Bramobry došly" --title="Hlášení ze sklepa"

Brambory došly, dialog
Tedy zenity, jak jste si všimli, pracuje na základě přepínačů, které určí typ, text a nadpis okna. Reakce na tento dialog může být vyvolání dialogu, který se zeptá, přejete-li si zaslat ženě SMS, aby koupila brambory.

1. zenity --question --text="Chcete informovat ženu o nutnosti nákupu brambor?" --title="Předání žádosti o doplnění zásob"
2. #Získání odpovědi (1 – Ne / 0 – Ano )
3. echo $?

Zenity uloží odpověď do posledního návratového kódu a standartním způsobem v bashi, jak k němu přistoupit. V následujícím kódu využiji podmínku v bashi, je to poměrně snadné, pokud tomu nerozumíte, je i na českém internetu spoustu materiálů k prostudování. Pokud tedy je návratová hodnota Ano (0 – divné, že?), zeptej se, kolik těch brambor jí má program poslat, to se uloží do proměnné X, viz konstrukce X=(něco). Do $? (poslední návratový kód) se uloží, jestli uživatel náhodou dialog nezrušil.

1. if [[ $? == 0 ]] ;
2. then X=$(zenity --entry --text="Kolik kg brambor má žena koupit?" --title="Počet brambor");
3. fi
Dialog s otázkou

Teď stačí předat skriptu, který obsluhuje zasílání sms zpráv ženě text zprávy a bonus pro vás, ten skript opravdu existuje … Jedná se o odesílání prostřednictvím služby poslatsms.cz, skript může mít zpoždění pro odeslání SMS, ale funguje. Vytvořil jsem ho na jednom cvičení se svým spolužákem.

1. msg="Ahoj milacku, kup prosim $X kg brambor, dosli nam ve sklepe";
2. cislo="123456789";
3. if [[ $? == 0 ]] ;
4. then notify-send $cislo "$msg";
5. ~/sms.sh $cislo "$msg";
6. fi

Skript si doporučuji stáhnout z mého dropboxu, protože WordPress to tady hrozně čuní a já nejsem natolik zdatný uživatel, abych mu to zakázal. Máte nějaký tip na vaše oblíbené programy, které používáte ve skriptech? Nebo nějaké triky a tipy? Podělte se o ně v komentářích!

Štítky , , .Záložka pro permanentní odkaz.

Autor: Ondřej Kolín

Student MFF, spokojený uživatel Linux Mint a mám spoustu zajímavých koníčků, které sem raději nebudu ani psát...

6 reakcí na Skriptování jako o život (GUI ve skriptech)

  1. huskyviking říká:

    Blahopřeji autorovi k pěknému článku, je jako ušitý pro uživatele, kteří chtějí trochu více nahlédnout pod pokličku a něco se naučit.
    Přiznám se, že jsem četl dvakrát, abych polovinu pochopil, určitě otestuji. 🙂

  2. huskyviking říká:

    První polovinu článku jsem zatím nevstřebal, skripty fungují, připomínám, že u obou skriptů je třeba povolit spouštění jako programu ve Vlastnostech, ve skriptu brambory.sh opravit chybky (bramobry a dosli), vyplnit číslo a zadat v osmém řádku umístění skriptu:
    ~/Bash-skriptování/sms.sh
    V terminálu spustit podobný příkaz:
    /home/karel/Bash-skriptování/brambory.sh
    Objeví se výše zmiňovaný dialog, SMS skutečně došla, pěkně jsem to schytal. Doporučuji si nechat zálohu stažených skriptů.

  3. huskyviking říká:

    Kolego, abych Tě jen nechválil, je dobré si po sobě článek přečíst, neboť WordPress dokáže opravdu napáchat škody při kopírování z například odt, myslím tím, že slibuješ odkaz v angličtině pro uživatele KDE, leč ten odkaz Ti chcípnul. Copy/paste nefunguje.
    Nemám možnost, jak jinak Ti o tom dát vědět. Díky za pochopení.

  4. KOLEGA říká:

    V pořádku, ihned doplním 🙂 jinak btw. tady na té soc. síti začly fungovat zprávy

  5. ZeRen říká:

    bylo by možné tohle použít na sledování baterie v NTB? tím myslím že když bude téměř vybitá přehraje nějaký zvuk

    • Ondřej Kolín říká:

      Jo, to by mělo jít … Btw. je to dobrý námět na článek napíšu si poznámku a spíchnu to 🙂 … Jinak použít na to jde nástroj power (vyzkoušejte power -e, seznam baterií a modulů napájení a power -i, který o kontroluje konkrétní stav konkrétního připojeného napájecího zařízení)