A 2. oldal tartalma
Dialógusok (folytatás az első oldalról)
Az első oldalon megismerhettük a Whiptail néhány dialógus fajtáját, itt folytatjuk a hátralévő ablaktípusok áttekintését.
Jelszó bekérő doboz (Password box)
A jelszó bekérő doboz segítségével biztonságosan kérhetünk be jelszavakat, mivel a begépelt szöveg helyén csillagok jelennek meg, ahogyan ez szokás a jelszavak használatakor. Így kényelmesen, elegánsan oldhatunk meg egy beléptető panelt a programjaink elején, hogy távol tarthassuk a jogosulatlan felhasználókat.
A panelt a --passwordbox kapcsolóval kelthetjük életre, melynek a szintaxisa:
--passwordbox <bekérő szöveg> <magasság> <szélesség> [kezdőérték]
- Bekérő szöveg: A jelszó mező fölé kiírandó szöveg
- Magasság: Panel magassága (a keretekkel együtt).
- Szélesség: Panel szélessége (a keretekkel együtt).
- Kezdőérték: Nem kötelező, megadhatunk kezdőértéket is, ami a panel megjelenítésekor beállításra kerül.
Viszont megzavarhatja a felhasználót, így kerüljük a használatát.
Alap példa:
1 2 3 4 5 6 #!/bin/bash whiptail \ --backtitle "Ablak főcíme" \ --title "Példa jelszó bekérő doboz" \ --passwordbox "Kérem adja meg a jelszót" \ 8 60
A panel megjelenése pedig:
Gombok tekintetében ez a dialógus fajta hasonlít a korábbi Igen/nem kérdező dobozhoz, így itt is célszerű kidolgozni a gombok lekezelését.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/bin/bash whiptail \ --backtitle "Ablak főcíme" \ --title "Példa jelszó bekérő doboz" \ --passwordbox "Kérem adja meg a jelszót" \ 8 60 # Kiértékelés case $? in 0) echo "Gomb használat: Ok gomb" ;; 1) echo "Gomb használat: Mégsem gomb" ;; 255) echo "Gomb használat: ESC billentyű" ;; *) # Ez nem fordulhat elő, csak betettem, hogy szabályosak legyünk... echo "Érvénytelen hibakód." ;; esac
Értékbevitel szempontjából pedig az Input box-ra hasonlít, így tehát itt is a szabványos hiba kimeneten (stderr) számíthatunk a beadott jelszóra.
Ennek megfelelően, ha változóba szeretnénk betölteni a begépelt jelszót, akkor itt is szükséges a kimenetek felcserélése, amikor lefuttatjuk a whiptail parancsot a subshell-ben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #!/bin/bash jelszo=$( \ whiptail \ --backtitle "Ablak főcíme" \ --title "Példa jelszó bekérő doboz" \ --passwordbox "Kérem adja meg a jelszót" \ 8 60 \ 3>&1 1>&2 2>&3) # Kiértékelés case $? in 0) echo "Gomb használat: Ok gomb" echo "A megadott jelszó: $jelszo" ;; 1) echo "Gomb használat: Mégsem gomb" ;; 255) echo "Gomb használat: ESC billentyű" ;; *) # Ez nem fordulhat elő, csak betettem, hogy szabályosak legyünk... echo "Érvénytelen hibakód." ;; esac
Így szépen bekerül a változóba a kapott jelszó, amit csak az Ok gomb lenyomása esetén használunk fel. És ezt még innentől lehet tovább bonyolítani a jelszó ellenőrzésétől kezdve a különböző szűrésekig, stb.
Menü
A menü dialógusablakkal tudunk klasszikus fénycsíkos menüket készíteni. Működtetése a --menu paraméterrel történik, melynek a szintaxisa a következő:
--menu <menüszöveg> <ablak magassága> <ablak szélessége> <lista magassága> <menüelem> <leírás> ...
- Menüszöveg: A menü opcói felett megjelenített szöveg
- Ablak magassága: A szokásos ablak magasság.
- Ablak szélessége: A szokásos ablak szélesség.
- Lista magassága: Itt szabályozhatjuk, hogy egyszerre hány menüelem legyen látható. Ezt össze kell hangolni az ablak magasságával, hogy ne lógjon ki a menü az ablakból.
- Menüelem: A megjelenített menüelem értéke (bal hasáb). Ez kerül ki a szabványos hibakimenetre, így a változóban is ezt fogjuk megkapni. Ez lehet szöveges is, vagy akár csak egy számjegyből álló menüpont is lehet.
- Leírás: Ez pedig a menüelem leírása. Ez csak a menüben megjelenített szöveghez kell.
A két utolsót (menüelem és leírás) kell ismételni szóközökkel elválasztott formában, pl.: "1" "menü1" "2" "menü2" "3" "menü3" ... Stb. Annyit rakhatunk be, amennyi menüelemre szükségünk van.
És a példaprogramunk, ami a jelszó bekérőhöz hasonlóan már változóba tölti az eredményt és a gomb lenyomásokat is kiértékeli:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #!/bin/bash menu=$( \ whiptail \ --backtitle "Ablak főcíme" \ --title "Példa menü" \ --menu "Kérem válassza ki a megfelelő opciót" 14 60 6 \ "Első menüpont" "Első menüpont leírása" \ "Második menüpont" "Második menüpont leírása" \ "Harmadik menüpont" "Harmadik menüpont leírása" \ "Negyedik menüpont" "Negyedik menüpont leírása" \ "Ötödik menüpont" "Ötödik menüpont leírása" \ "Hatodik menüpont" "Hatodik menüpont leírása" \ "Hetedik menüpont" "Hetedik menüpont leírása" \ "Nyolcadik menüpont" "Nyolcadik menüpont leírása" \ "Kilencedik menüpont" "Kilencedik menüpont leírása" \ "Tizedik menüpont" "Tizedik menüpont leírása" \ 3>&1 1>&2 2>&3) # Kiértékelés case $? in 0) echo "Gomb használat: Ok gomb" echo "A kiválasztott menüelem: $menu" ;; 1) echo "Gomb használat: Mégsem gomb" ;; 255) echo "Gomb használat: ESC billentyű" ;; *) # Ez nem fordulhat elő, csak betettem, hogy szabályosak legyünk... echo "Érvénytelen hibakód." ;; esac
Érdekességképpen itt már megjelenik egy kis görgetősáv szerűség, ami inkább az aktuális menüelem pozícióját hivatott kijelezni a teljes listához képest, amennyiben nem férnek ki egyszerre a menüelemek a panelre.
Az Ok gomb lenyomásakor itt a kiválasztott menüelem érték mezőjét kapjuk meg, tehát ami a jelen példában a bal hasábban van. Itt nevek helyett számozást is használhatunk, és akkor numerikus értékeket kell feldolgoznunk a program további részeiben, valamint a menük leírásainak is több hely marad a jobb hasábban. A gombok lekezelése ugyanígy történik itt is, mint a korábbi példákban (Ok / Mégsem / ESC gombok).
Opciós lista (Check list)
Az opciós listákkal (talán ez a legmegfelelőbb elnevezés rá) tudunk létrehozni például különböző beállításos paneleket, amin egymástól függetlenül lehet ki-bekapcsolni az opciókat.
Ezt a panelt a --checklist paraméterrel kelthetjük életre a következő szintaxissal:
--checklist <szöveg> <magasság> <szélesség> <lista-magasság> [érték címke állapot] ...
- Szöveg: Lista felett megjelenítendő szöveg
- Magasság: A szokásos ablak magassága
- Szélesség: A szokásos ablak szélessége
- Lista-magasság: Itt is szabályozhatjuk, hogy hány opció legyen látható egyszerre. Ha több van, akkor megjelenik a görgető funkció.
- Érték címke állapot: Itt pedig hármasával kell megadnunk az opciók tulajdonságait:
- érték: Opció értéke. Ez kerül továbbításra a programban
- címke: Az opció felirata, ide bármi írható
- állapot: Ez pedig az opció alapértelmezett állapota. Például egy beállítópanel esetén ezekkel töltjük fel a már lementett beállítások állapotait.
Példaprogram:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #!/bin/bash selected_options=$( \ whiptail \ --backtitle "Ablak főcíme" \ --title "Példa checklist" \ --checklist \ "Kérem válassza ki a megfelelő beállításokat" \ 14 60 6 \ "A opció" "A opció leírása" ON \ "B opció" "B opció leírása" OFF \ "C opció" "C opció leírása" ON \ "1" "1-es opció leírása" OFF \ "2" "2-es opció leírása" ON \ "3" "3-as opció leírása" OFF \ --separate-output \ 3>&1 1>&2 2>&3) # Kiértékelés case $? in 0) echo "Gomb használat: Ok gomb" echo "A kiválasztott opciók: $selected_options" ;; 1) echo "Gomb használat: Mégsem gomb" ;; 255) echo "Gomb használat: ESC billentyű" ;; *) # Ez nem fordulhat elő, csak betettem, hogy szabályosak legyünk... echo "Érvénytelen hibakód." ;; esac
Ez a panel is hasonlóan működik, mint a menü, így nincs mit ragozni rajta. Egyedül annyi a különbség, hogy itt több opciót is visszakaphatunk a panelen beállított választásoktól függően. Ilyenkor érdemes a --separate-output kapcsolót is használni, mert így könnyebben feldolgozható kimenetet kapunk. Nélküle egy sorba kerülnek idézőjelek közé a kiválasztott opciók, amit macerásabb szétbontani.
Rádió gombok (Radio list)
A rádió gombokkal készíthetünk többállapotú kapcsolókat, ahol egyszerre csak egy elem lehet beállítva.
A panelt a --radiolist paraméterrel nyithatjuk meg a következő szintaxissal:
--radiolist <szöveg> <magasság> <szélesség> <lista-magasság> [érték címke állapot] ...
Használata megegyezik az előző opciós lista dialógus beállításaival.
Példa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #!/bin/bash selected_option=$( \ whiptail \ --backtitle "Ablak főcíme" \ --title "Példa rádió gombok" \ --radiolist \ "Kérem állítsa be a megfelelő értéket" \ 14 60 6 \ "1" "1-es beállítás" OFF \ "2" "2-es beállítás" ON \ "3" "3-as beállítás" OFF \ 3>&1 1>&2 2>&3) # Kiértékelés case $? in 0) echo "Gomb használat: Ok gomb" echo "A kiválasztott beállítás: $selected_option" ;; 1) echo "Gomb használat: Mégsem gomb" ;; 255) echo "Gomb használat: ESC billentyű" ;; *) # Ez nem fordulhat elő, csak betettem, hogy szabályosak legyünk... echo "Érvénytelen hibakód." ;; esac
Az előzőekhez hasonlóan itt is ugyanígy kell kiolvasni a gomb állapotot és a kiválasztott opciót. Itt egyetlen értéket kapunk a szabványos hiba kimeneten, így könnyen feldolgozható az eredmény.
Folyamatjelző (Progress gauge)
A folyamatjelzővel tudjuk "elütni" az időt, amíg például a háttérben fut egy hosszabb folyamat. Így a felhasználó várakozás közben láthatja hogy hol tart a program futása.
A panelt a --gauge paraméterrel tudjuk előhívni:
--gauge <szöveg> <magasság> <szélesség> <százalék>
- Szöveg: Szokásos panelszöveg
- Magasság: Panel magassága
- Szélesség: Panel szélessége
- Százalék: Ennyi százalékra állítja be a folyamatjelzőt
Egy egyszerű statikus példa:
1 2 3 4 5 #!/bin/bash whiptail \ --backtitle "Ablak főcíme" \ --title "Példa szövegdoboz" \ --gauge "A folyamat állapota:" 8 65 12
Ha így elindítjuk a programot, akkor az "beragad" és nem tudunk belőle kilépni, max terminál bezárás vagy másik terminálból lehet kilőni. A program futását nem akasztja meg, hiszen pont ez a lényege, hogy a háttérben tudjunk dolgozni, csak a kimenetet állítja át erre a képre. Ezért ezt a panelt úgy kell használni, hogy például egy ciklusból léptetjük a százalékokat, amiben végezzük a hosszabb háttér feladatainkat:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash { for ((i = 0 ; i <= 100 ; i+=1)); do # háttér feladatok elvégzése sleep 0.1 # kis késleltetés # ... # ... # százalék kiírása a kimenetre, amit csővezetéken megkap a whiptail echo $i done } | whiptail \ --backtitle "Ablak főcíme" \ --title "Példa szövegdoboz" \ --gauge "A folyamat állapota:" 8 65 0
Ebben a példában a fenti ciklus "hajtja meg" a folyamatjelzőt. A ciklusban csak a százalék állapotot írjuk ki a kimenetre, amit egy csővezetéken kap folyamatosan a whiptail. Itt tehát elindul a 0% kezdő beállításról és végigmegy 100%-ig, majd kilép. A ciklusban pedig el tudjuk végezni a háttér feladatokat, amiket természetesen százalékosan szétbontottunk. Pl fájlok másolása apránként, stb.
Természetesen másfajta ciklusokkal vagy pl nagyméretű fájl beolvasással vagy más léptékkel is meg lehet hajtani, a lényeg hogy a kimeneten folyamatosan adjuk át a whiptail-nak a százalék értéket.
Konklúzió
Ebben a kétoldalas leírásban megismerhettük a whiptail parancs nyújtotta lehetőségeket, amikkel gyorsan és kevés programkóddal jeleníthetünk meg különféle dialógusablakokat. Nagyobb programok írásánál különösen jól jön, ha a megfelelő panelekkel menükbe tudjuk szervezni a projekt részeit, vagy különféle beállítópanelekkel és mentési lehetőségekkel látjuk el azokat.
Lapozó
- A hozzászóláshoz regisztráció és bejelentkezés szükséges
- 132 megtekintés