Ismerkedés a Whiptail dialóguskészítő programmal (2. oldal)

botond küldte be 2018. 10. 22., h - 02:45 időpontban

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:

Whiptail - Password box bemutatása

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.

 

 

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

Whiptail - Menüdoboz  bemutatása

É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

Whiptail - Checklist bemutatása

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

Whiptail - Rádió gombok bemutatása

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

Whiptail - Folyamatjelző bemutatása

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.

 

Felhasznált források, hasznos linkek:

 

Lapozó

Ez a leírás több oldalból áll: