Dialog

Allikas: Kuutõrvaja

Sissejuhatus

Linux'i/Unixi puhul on võimalus kasutada tohutult mitmesuguseid nö. script keeli. Üks neist on dialog. Ta on omapärane selles mõttes, et tulemuseks on aknad ja dialoogi-kastid -- sealt ilmselt ka nimi. Siiski, need kastid tekivad textireshiimis ekraanile. Mitte X'i all. Praktilisest elust on paljud ilmselt näinud milline on FreeBSD installeerimise programm 'sysinstall' mis on tehtud dialog'i peale.

Scripti kirjutamise mõttes on tegu tavalise bash shelli script'iga, mis sisaldab mõningaid sepetsiifilisi käske.

Näited

Mina tegin kõigepealt scripti mis kasutas dialog'i kusjuures script võimaldas mugavamini kui käsurealt arvutiga suheldes moodustada kataloogis olevatest failidest iso imaget (vt. viimane näide). Seda image't saab cd peale kirjutada programmiga cdrecord.

 #!/bin/sh
 dialog --title "ahha; aeg on muide `date`"\
        --msgbox "Ja nii nad lähevad ja liiguvad.\nTeie ees on\
  aga message box!" 14 60

[[Pilt:Snap162.jpg]]

Siin tuleb tähele panna, et rea lõpus olev '\' märk peab olema tõesti reas viimane! See näitab, et rida läheb edasi uuelt realt. Võib ka nii mõista, et nagu ikka, \ lihtsalt escape'b talle järgneva sümboli milleks on reavahetus.

Kõike mis shell scriptis on ` - märkide vahel interpreteeritakse kui käsku ja asendatakse selle käsu standard-väljundiga.

<source lang=bash>
 #!/bin/sh
 dialog --title "ahha; aeg on muide `date`"\
        --msgbox "Ja nii nad lähevad ja liiguvad.\nTeie ees on\
  aga message box!\n\nVajutage reavahetust!" 14 60 
 
 dialog --title "`hostname -f`"\
        --inputbox "Mis on teie nimi? Sisestage!" 8 40 \
 2>/tmp/seda.faili.enne.polnud
 
 nimi=`cat /tmp/seda.faili.enne.polnud`
 rm -f /tmp/seda.fali.enne.polnud
  
 dialog --title "`date`"\
        --msgbox "Tere $nimi, kuis on?" 7 60

Snap165.jpg

Pange tähele võtmesõnu: title, msgbox! Taga olevad kaks arvu määravad kasti kõrguse ja laiuse (jääge esialgu piiridesse 25x80; aga kui lilosse pista 'vga=ask' siis saate peale booti valida ehk mõne parema videoreshiimi textimoodi jaoks. NB! peale lilo.conf faii muutmist tuleb anda käsk 'lilo'!

 #!/bin/sh
 PID=$$
 dialog --title "ahha; aeg on muide `date`"\
        --inputbox "Millist olemasolevat teikstifaili tahate\
 browseda?" 14 60 2>/tmp/seda.polnud.$PID
 
 dialog --title "vaike browsija"\
        --textbox "`cat /tmp/seda.polnud.$PID`" 22 78
 
 rm -f /tmp/seda.polnud.$PID

Snap166.jpg

Siin on textbox. textbox erineb msgbox'ist selle poolest, et textbox on nagu väike browser: saab /- ga otsida. Samuti üles/alla liikuda.

Ja $$ on kaval muutuja: ta on programmi enda protsessi PID. Seda kasutades saab moodustada suhteliselt kindlasti unikaalseid failinimesid. Ja viimane rida on vajalik, et rämpsu alles ei jääks.

Järgmine näide on "Juhtimispult"

Tegemist on while tsükliga millest saab välja valides <Cancel>' i või Ctl-c'ga.

 #!/bin/sh
 while [ 1 ]; do
 PID=$$
 dialog --title "Juhtimispult"\
        --menu "Liikuge noole klahvidega sobivale reale ja vajutage reavahetust.\
  Lõpetamiseks vajutage <Cancel> peale"\
    15 60 6 \
    "1" "Kes kasutavad hetkel süsteemi?" \
    "2" "Milline on failisüsteemi kasutus?" \
    "3" "Millised protsessid hetlkel käivad?" 2> /tmp/seda.pole.$PID
 if [ $? = "1" ]; then
    rm -f /tmp/ans
    clear
    exit 0
 fi
 
 V="`cat /tmp/seda.pole.$PID`"
 
 if [ $V = "1" ]; then
 w > /tmp/seda.pole.$PID
    dialog --title "Kes kasutavad süsteemi?"\
           --textbox "/tmp/seda.pole.$PID" 18 82
 
 elif [ $V = "2" ]; then
 df > /tmp/seda.pole.$PID
    dialog --title "Milline on failisüsteemi kasutus?"\
           --textbox "/tmp/seda.pole.$PID" 18 82
 
 elif [ $V = "3" ]; then
 ps aux > /tmp/seda.pole.$PID
    dialog --title "Millised on süsteemis töötavad protsessid?"\
           --textbox "/tmp/seda.pole.$PID" 18 82
 
 fi
 done

Snap167.jpg

Snap170.jpg

uus asi on '--menu'. Lugu on nii, et peale valiku tegemist saadetakse nö. esimese tulba märk standard-errorisse. See tuleb sealt kinni püüda ja saata hoopis faili mida me hiljem kasutama hakkame :)

Jah, nagu ikka loevad tühikud või nende puudumine!

 #!/bin/sh
 PID=$$
 while [ 0 ]; do
 dialog --title "Juhtimispult" --menu \
 "Liikuge noole klahvidega sobivale reale ja vajutage reavahetust.\
  Lõpetamiseks vajutage <Cancel> peale"\
    15 60 6 \
    "1" "Joliet ISO failisüsteemi image" \
    "2" "Failisüsteemi kasutus" \
    "3" "Süsteemi kasutajad" \
    "4" "Süsteemis töötavad protsessid" 2>/tmp/seda.pole.$PID
 if [ $? = "1" ]; then
    rm -f /tmp/seda.pole.$PID
    clear
    exit 0
 fi
 R="`cat /tmp/seda.pole.$PID`"
 if [ $R = "1" ]; then
    dialog --title "Failisüsteemi kasutus"\
           --msgbox "Hinnake kas on piisavalt ruumi luua image fail.\n\
  Image fail võtab praktiliselt sama palju ruumi kui sinna mahutatav\n\
  kataloogi-struktuur. \nkopka puhul on soovitatav tegutseda /hdb1/cdrw\
  all.\n Seal on tavaliselt kõige rohkem ruumi.\n\n\
 `df`\n\n NB! toodud arvud tähistavad kilobaite (KB)" 18 82
 
  dialog --title "Küsimus"\
       --yesno "Kas ruumi on piisavalt, et edasi minna? Valige kas jah või ei" 10 50
          if [ $? = 0 ]; then
             sleep 0
          else
             continue
          fi
 
    dialog --title "Sisestus:"\
       --inputbox "Te asute kataloogis /hdb1/cdrw; Milline saab olema image
 faili nimi?\
 Kui tahate faili tekitada mujale andke pikk tee: nt. \
 /home/imre/cdrw/minu.img"\
       8 60 $F 2>/tmp/img.nimi
    if [ $? = "1" ]; then
       continue
    fi
    dialog --title "Sisestus:"\
      --inputbox "Millisest kataloogist allapoole jäävad failid sinna\
  kirjutada? Seekord andke pikk tee; nt. /home/imre/failid"\
       8 60 $F 2>/tmp/img.kataloog
    if [ $? = "1" ]; then
       continue
    fi
    img="`cat /tmp/img.nimi`"
    kataloog="`cat /tmp/img.kataloog`"
    dialog --title "Ootan kinnitust?"\
    --yesno "image fail: $img\nkasutatav kataloog: $kataloog\nKas on nii?" 10 50
          if [ $? = 0 ]; then
             touch $img
              mkisofs -a -J -o $img $kataloog > /dev/null 2>&1 &
 
 kataloog_i=`du -s $kataloog | awk '{print $1}'`
 veel=0;
 { while [ $veel -eq 0 ]; do
 fail=`ls -l $img | awk '{print $5}'`
 p=`expr $fail / $kataloog_i / 10`
 echo $p;
 sleep 1;
 ps aux | grep mkisofs
 veel=$?
 echo "veel: $veel\n"
 done
 echo;
 } | dialog --guage "Guage on see" 6 70 0
 
          else
             continue
          fi
 elif [ $R = "2" ]; then
    df > /tmp/fs_usage
    dialog --title "Choose file" \
           --textbox /tmp/fs_usage 25 98
 
 elif [ $R = "3" ]; then
    w > /tmp/whoare_on
    dialog --title "Süsteemi kasutavad `date`"\
           --textbox /tmp/whoare_on 25 98
 elif [ $R = "4" ]; then
    ps aux > /tmp/protsessid
    dialog --title "Süsteemis töötavad protsessid `date`"\
           --textbox /tmp/protsessid 25 98
 fi
 done

Snap171.jpg

Siin on kaks uut asja:

- yesno box:

  dialog --title "Küsimus"\
      --yesno "Kas ruumi on piisavalt, et edasi minna? Valige kas jah või ei" 10 50
         if [ $? = 0 ]; then
            sleep 0
         else
            continue
         fi

- guage - näitab ekraanil protsenti.

 { while [ $veel -eq 0 ]; do
 fail=`ls -l $img | awk '{print $5}'`
 p=`expr $fail / $kataloog_i / 10`
 echo $p;
 sleep 2;
 ps aux | grep mkisofs
 veel=$?
 done
 } | dialog --guage "Guage on see" 6 70 0

selle väikese lõigu mõte on selles, et iga while tsükkel annab üherealise väljundi (echo $p) mis on arv mis trükitakse iga kord ekraanile. Ja while kütab seni kuini $veel on võrdne "0" ga. Nulliga on ta aga võrdne seni kuni 'ps aux | grep mkisofs' annab tulemuse. st. leiab ta protsesside nimekirjast. Kui enam ei leia on asi valmis saanud. Muuseas, mkisofs on vahest liiga pikk. piisab selle asendamisest kahe tähega. nt. mk. Peab vaatama, et korraga mitu kasutajat mkisofs'i ei tarvita! Aga võib ka midagi kavalamat välja mõtelda.


Linux kasutab vaikimisi menüüde tegemiseks whiptail, FreeBSD's asub see paketis newt