(X)dialog: Shell parlanti
ArticleCategory: [Choose a category, translators: do not translate
this, see list below for available categories]
UNIXBasics
AuthorImage:[Here we need a little image from you]
TranslationInfo:[Author + translation history. mailto: or http://homepage]
original in en
Katja and Guido Socher
en to it Kikko
AboutTheAuthor:[A small biography about the author]
Katja è la redattrice per la Germania di LinuxFocus. Ama Tux, i film &
photography e adora il mare. La sua pagina personale la trovate qui.
Guido è un fan di lunga data di Linux; gli piace Linux perchè è stato creato da
gente onesta e disponibile.Questo è uno dei motivi per i quali si parla di opensource.
La sua homepage si trova su linuxfocus.org/~guido.
Abstract:[Here you write a little summary]
Xdialog e dialog sono due classici strumenti che dotano i vostri script
per la shell di una interfaccia grafica (GUI).
Per comprendere quest'articolo avrete bisogno di qualche nozione basilare di programmazione.
Per iniziare a conoscere i fondamenti della programmazione della shell potreste
leggere il nostro articolo
Shell Programming.
ArticleIllustration:[One image that will end up at the top of the
article]
ArticleBody:[The main part of the article]
Introduzione
La shell UNIX costituisce un ambiente molto fertile di per sè stesso
e lavora benissimo anche senza un'interfaccia grafica.
Tuttavia, talvolta, per alcuni utenti è di grossa importanza trovarsi di
fronte a finestre di dialogo. Un esempio potrebbe essere l'interfaccia di installazione
di un programma. Avere parecchie opzioni di installazione e poter scegliere la
directory di installazione...
Approccio ad (X)dialog...
Con dialog e Xdialog potrete creare delle applicazioni grafiche digitando
giusto qualche riga di codice. Dialog è un programma basato sul terminale
puro e semplice, mentre Xdialog è un programma per X11.
Ecco un esempio:
Potete ridigitare (o fare un copia/incolla) le seguenti linee in una shell (xterm,
konsole,....):
bash
Xdialog --yesno "Do you want to learn more about Xdialog?" 0 0;\
case $? in
0)
echo "Result: Yes chosen.";;
1)
echo "Result: No chosen.";;
255)
echo "ESC pressed.";;
esac
Il riquadro che vi apparirà avrà più o meno quest'aspetto:
Se usate dialog invece che Xdialog (eliminate la X nella seconda linea dello script
sopraesposto) otterrete un'applicazione basata su curses che funziona all'interno
di xterm e che non apre una nuova finestra. In qualche caso questo è più
appropriato per uno script di shell creato appositamente per la finestra di terminale.
E' particolarmente indicato nel caso in cui vogliate avviarlo da remoto avendo
un certo numero di host tra il vostro computer e l'host remoto: non sarebbe infatti
possibile un rooting IP diretto. In questo caso dialog funzionerebbe ma non potrebbe
far partire un'applicazione X11 come invece potrebbe fare Xdialog.
Quello qui sopra è un esempio carino ma senza grossa utilità di
dialog/Xdialog, tuttavia dimostra quanto sia semplice programmare una semplice
finestra di dialogo. Esistono finetre di dialogo molto più complesse e
interessanti. Son possibili effetti tridimensionali, calendari, menu, filemanager,
barre di avanzamento, riquadri di testo, di avvisi e di password... Potete digitare
dialog --help
oppure
Xdialog --help
per avere una lista delle finestre disponibili. Xdialog ha qualche riquadro
in più di dialog.
Come funziona
I riquadri di dialog vengono configurati da linea di comando.
dialog --yesno "text string" <height> <width>
Una volta digitato "dialog" o "Xdialog" dovrete scrivere
il nome del box che avete scelto, più i suoi parametri specifici.
Il box "yesno" (si - no) ammette tre variabili. Quella <heigh>
(altezza) e <width> (larghezza) possono essere settate a zero se si vuole
che la dimensione del box sia scelta automaticamente a seconda dello spazio che
sarà occupato dal testo al suo interno. L'esito viene restituito
come "exit status" nella variabile "$?" dello script. Se vengono restituiti
anche altri esiti come ad esempio i nomi delle opzioni selezionate, allora verranno
mostrati come standard error. Gli Standard error normalmente son stampati a schermo
ma possono essere rediretti con ">2".
Un esempio semplice ma efficace.
Un esempio pratico
Creiamo adesso una applicazione in cui Xdialog/dialog forniscono un qualche
vantaggio su un normale script per shell: un menu in cui si possa selezionare
tra differenti ISP (Internet Service Providers) quello con cui si vuole iniziare
la connessione ad Internet. Questo script richiede, per poter funzionare, lo script
"ppp-on/ppp-off" descritto nell'articolo del marzo 2001 chiamato
Usare diversi ISP per il vostro accesso ad Internet. Lo script si chiama pppdialout
e mostra diversi menu a seconda che si sia o meno connessi.
#!/bin/sh
#
#DIALOG=Xdialog
DIALOG=dialog
#
# name of your default isp:
defaultisp=maxnet
#
error()
{
echo "$1"
exit 2
}
help()
{
cat <<HELP
pppdialout -- select an ISP and dial out.
All available ISPs must have a config file in /etc/ppp/peers
pppdialout executes the ppp-on/ppp-off scripts as described
in http://linuxfocus.org/English/March2001/article192.shtml
pppdialout, copyright gpl, http://linuxfocus.org/English/November2002
HELP
exit 0
}
# parse command line:
while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;; # function help is called
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
tempfile=/tmp/pppdialout.$$
trap "rm -f $tempfile" 1 2 5 15
# check if we have a ppp network interface
if /sbin/ifconfig | grep '^ppp' > /dev/null; then
# we are already online
$DIALOG --title "go offline" --yesno "Click YES to \
terminate the ppp connection" 0 0
rval="$?"
clear
if [ "$rval" = "0" ]; then
echo "running /etc/ppp/scripts/ppp-off ..."
/etc/ppp/scripts/ppp-off
fi
else
# no ppp connection found, go online
# get the names of all available ISP by listing /etc/ppp/peers
for f in `ls /etc/ppp/peers`; do
if [ -f "/etc/ppp/peers/$f" ]; then
isplist="$isplist $f =="
fi
done
[ -z "$isplist" ]&&error "No isp def found in /etc/ppp/peers"
#
$DIALOG --default-item "$defaultisp" --title "pppdialout" \
--menu "Please select one of\
the following ISPs for dialout" 0 0 0 $isplist 2> $tempfile
rval="$?" # return status, isp name will be in $tempfile
clear
if [ "$rval" = "0" ]; then
isp=`cat $tempfile`
echo "running /etc/ppp/scripts/ppp-on $isp..."
/etc/ppp/scripts/ppp-on "$isp"
else
echo "Cancel..."
fi
rm -f $tempfile
fi
# end of pppdialout
Come funziona lo script:
All'inizio definisce qualche funzione, errori ed help e poi controlla gli argomenti
da linea di comando e viene definito un nome per il file temporaneo (/tmp/pppdialout.$$).
$$ è il nome del processo corrente e consiste in un numero unico per
ogni computer. L'espressione "trap" è eseguita se il programma
viene chiuso in modo anomalo (ad esepio se l'utente clicca ctrl-c) a cancella
il file temporaneo. Dopo controlla se siamo ancora in linea o meno (comando:
/sbin/ifconfig | grep '^ppp'). Se siamo ancora in linea allora apre una yesno-box,
come quella che abbiamo già visto prima, e chiede all'utente se vuol
continuare offline. Se non siamo più online si apre la finestra-menu.
Qui abbiamo la lista di tutti gli ISP disponibili contenuti nel file /etc/ppp/peers
(ls /etc/ppp/peers). La sintassi del menu box è:
dialog --menu "text" <height> <width> <menu
height> <tag1> <description> ...
I parametri<height>, <width> e <menu height> vengono nuovamente
settati a zero (in modo da avere un dimensionamento automatico) e quindi il programma
aspetta che vengano immessi due parametri (<tag1> <description>).
Non forniremo una descrizione dettagliata, perciò per qualcuno potrebbero
essere discorsi di difficile comprensione. I dati nella variabile isplist dovrebbero
risultare qualcosa del genere:
isp1 == isp2 == isp3 ==
Il risultato della scelta fatta dall'utente viene stampata da (X)dialog sullo
standard error. Il comando di shell "2> $tmpfile" lo scrive nel tmpfile. Il
menu box offre anche la possibilità di cancellare. Quindi dobbiamo controllare
$? (exit status) per capire quale pulsante è stato premuto.
Ok, basta teoria. Qui vediamo come dovrebbe sembrare il tutto.
... con una bella GTK GUI con Xdialog:
... con la finestra di dialogo basata sulle curses nel terminale:
Più applicazioni
Abbiamo un'altro programmino pronto per voi. Si chiama mktgz ed utilizza
la checklist box di Xdialog. La finestra di dialogo per terminale non ha una checklist,
perciò mktgz funziona solo con Xdialog. Potete usare mktgz per creare pacchetti
tar.gz.
mktgz yourpackage .
Questo comando mostra tutti i file nella directory corrente (".") e potete
selezionarna altre da includere nel vostro pacchetto vostropacchetto.tar.gz. Potete
scaricare qui (mktgz.txt)
mktgz. Non ci addentreremo nelle linee di codice perchè quello che avete
letto qui dovrebbe bastarvi per capire da soli il contenuto di questo script.
Xdialog e dialog hanno una directory chiamata "samples" dove troverete molti più
esempi (Redhat 7.3 li raccoglie sotto la cartella /usr/share/doc/Xdialog-2.0.5/samples).
Considerate, tuttavia, che alcune samples non son delle mere applicazioni demo
ma eseguono dei compiti ben precisi.
Conclusioni
Xdialog e dialog offrono un numero consistente di dialog boxes. Non tutte
queste finestre di dialogo son sempre applicabili a qualsiasi script di shell.
La shell stessa costituisce un "ambiente" molto versatile e potente.
Completare un percorso ad un file può essere molto più conveniente
e veloce in shell con il tasto TAB, piuttosto che cercare quello stesso file cliccando
nelle cartelle contenute in una finestra grafica. In particolare la possibilità
offerta da pipeline e dalla combinazione dei comandi rende la shell uno strumento
insuperabile. Qualcosa tipo:
grep -i "somestring" file.txt | sort | uniq | wc -l
(per chi non avesse abbastanza esperienza con le shell UNIX: Questo comando
conta quante linee del file file.txt contengono il termine "somestring")
Tale articolazione di pipeline è possibile poichè tutti i comandi
son controllati dagli argomenti di linea di comando. In altre parole: chiedono
in continuazione all'utente se voglia continuare.
Comunque ci son applicazioni dove le finestre di dialogo sono realmente utili.
Xdialog e dialog son molto facili da usare ma certamente non quanto una applicazione
grafica. Essi colmano il dislivello tra uno script per shell ASCII e una applicazione
grafica.
Dove trovare Xdialog e dialog?
I CD della vostra distribuzione Linux sono il primo posto dove dovreste cercare
dialog e Xdialog. Potrebbe anche darsi che siano già installati sul vostro
computer (chiedete al vostro computer: ad esempio rpm -qil Xdialog, dpkg -L Xdialog).
La homepage di Xdialog è:
http://www.chez.com/godefroy/
e dialog si trova su
http://hightek.org/dialog/
Nel caso in cui non li abbiate trovati installati o nei vostri CD potrete anche
cercarli nei loro siti ufficiali.
Riferimenti