Dialog
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
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
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
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
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