<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//IT"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="GENERATOR" CONTENT="lfparser_2.29"> <META NAME="LFCATEGORY" CONTENT="UNIXBasics"> <TITLE>lf267, UNIXBasics: (X)dialog: Shell parlanti</TITLE> <style type="text/css"> <!-- td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 } pre { font-family:monospace,Courier } p.cl { color:#EE9500 } a.nodec { text-decoration:none } p.trans { font-size:8pt; text-align:right } p.clbox { width:50%; alignment:center; background-color:#FFD700; border-style:none; border-width:medium; border-color:#FFD700; padding:0.5cm; text-align:center } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm; text-align:left } p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; border-width:medium; border-color:#AAAAAA; padding:0.5cm ; margin-top:0.1cm; margin-right:1cm; margin-left:1cm; text-align:center } .mark { background-color:#e6e6ff } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://www.linuxfocus.org/~guido/dev/lfparser.html --> <!-- this is used by a number of tools: =LF=AUTHOR: Katja and Guido Socher =LF=CAT___: UNIXBasics =LF=TITLE_: (X)dialog: Shell parlanti =LF=NUMBER: 267 =LF=ANAME_: article267.shtml --> <!-- 2pdaIgnoreStart --> <!-- start navegation bar --> <!-- top navegation bar --> <TABLE summary="topbar_1" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#2e2292"> <TD class="top"><TABLE summary="topbar_1_logo" cellspacing="0" cellpadding="0" border="0" width= "100%"> <TR><TD width="319"><IMG src="../../common/images/logolftop_319x45.gif" alt="[LinuxFocus-icon]" width="319" height="45" align="left" border="0"></TD> <TD class="top"> <TABLE summary="topbar_1_links" width="100%"> <TR align="right"> <TD class="top"><A class="nodec" href="../index.shtml"><FONT color= "#DDDDDD" size="2">Home</FONT></A> | <A class= "nodec" href="../map.html"><FONT color= "#DDDDDD" size="2">Mappa</FONT></A> | <A class= "nodec" href="../indice.html"><FONT color= "#DDDDDD" size="2">Indice</FONT></A> | <A class="nodec" href="../Search/index.shtml"><FONT color= "#DDDDDD" size="2">Cerca</FONT></A> </TD> </TR> <TR align="right"> <TD class="top"> <HR width="100%" noshade size="1"> </TD> </TR> </TABLE> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end top navegation bar --> <!-- blue bar --> <TABLE summary="topbar_2" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#00ffff"> <TD><IMG src="../../common/images/transpix.gif" width="1" height= "2" alt=""></TD> </TR> </TABLE> <!-- end blue bar --> <!-- bottom navegation bar --> <TABLE summary="topbar_3" cellspacing="0" cellpadding="0" border="0" align="center" width="94%"> <TR bgcolor="#000000"> <TD> <TABLE summary="topbar_3_links" cellspacing="0" cellpadding="1" border="0" width= "100%"> <TR align="center"> <TD WIDTH="20%"><A class="nodec" href="../News/index.shtml"><FONT color= "#FFFFFF">News</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color= "#FFFFFF">Archivo</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Links/index.html"><FONT color= "#FFFFFF">Link</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color= "#FFFFFF">Cose LF</FONT></A> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end bottom navegation bar --> <!-- stop navegation bar --> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.4 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Questo documento è disponibile in: <A href="../../English/November2002/article267.shtml">English</a> <A href="../../Castellano/November2002/article267.shtml">Castellano</a> <A href="../../ChineseGB/November2002/article267.shtml">ChineseGB</a> <A href="../../Deutsch/November2002/article267.shtml">Deutsch</a> <A href="../../Francais/November2002/article267.shtml">Francais</a> <A href="../../Italiano/November2002/article267.shtml">Italiano</a> <A href="../../Nederlands/November2002/article267.shtml">Nederlands</a> <A href="../../Russian/November2002/article267.shtml">Russian</a> <A href="../../Turkce/November2002/article267.shtml">Turkce</a> </FONT></TD></TR></TABLE><br> <!-- SSI_INFO STOP --> <!-- 2pdaIgnoreStop --> <!-- SHORT BIO ABOUT THE AUTHOR --> <TABLE ALIGN=LEFT BORDER=0 WIDTH="190" summary="about the author"> <TR> <TD> <!-- 2pdaIgnoreStart --> <!-- PALM DOC --> <TABLE BORDER=0 hspace=4 vspace=4 summary="pda download"> <TR> <TD> <font size=1> <img src="../../common/images/2doc.gif" width=34 align=left border=0 height=22 alt="convert to palm"><a href="http://cgi.linuxfocus.org/cgi-bin/2ztxt">Convert to GutenPalm</a><br>or <a href="http://cgi.linuxfocus.org/cgi-bin/2pda">to PalmDoc</a></font> </TD> </TR> </TABLE> <!-- END PALM DOC --> <!-- 2pdaIgnoreStop --> <br> <img src="../../common/images/KatjaAndGuido.jpg" alt="[Photo of the Authors]" height="150" width="168"> <BR> Katja and Guido Socher <br> <small><katja(at)linuxfocusorg, %20guido(at)linuxfocus.org></small> <BR><BR> <I>About the authors:</I><BR> Katja è la redattrice per la Germania di LinuxFocus. Ama Tux, i film & photography e adora il mare. La sua pagina personale la trovate <a href="http://linuxfocus.org/%7Ekatja/">qui</a>. 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 <a href="http://linuxfocus.org/%7Eguido/"> linuxfocus.org/~guido</a>. <!-- TRANSLATED TO it --> <BR><BR><I>Tradotto in Italiano da:</I><BR> Kikko <small><kikko(at)linuxfocus.org></small> <br> <!-- TRANSLATED TO STOP --> <BR><i>Contenuto</i>: <UL> <LI><A HREF="#267lfindex0">Introduzione</A></LI> <LI><A HREF="#267lfindex1">Approccio ad (X)dialog...</A></LI> <LI><A HREF="#267lfindex2">Come funziona</A></LI> <LI><A HREF="#267lfindex3">Un esempio pratico</A></LI> <LI><A HREF="#267lfindex4">Più applicazioni </A></LI> <LI><A HREF="#267lfindex5">Conclusioni</A></LI> <LI><A HREF="#267lfindex6">Dove trovare Xdialog e dialog?</A></LI> <LI><A HREF="#267lfindex7">Riferimenti</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=267&lang=en">Discussioni su quest'articolo</A></LI> </UL> </TD></TR></TABLE> <!-- HEAD OF THE ARTICLE --> <br> <H2>(X)dialog: Shell parlanti</H2> <img src="../../common/images/article267/shelltalk.jpg" width="200" height="202" alt="[Illustration]" hspace="10"> <!-- ABSTRACT OF THE ARTICLE --> <P><i>Premessa</i>: <P> Xdialog e dialog sono due classici strumenti che dotano i vostri script per la shell di una interfaccia grafica (GUI). <br> 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 <a href="../September2001/article216.shtml"> Shell Programming</a>. <br> <br><!-- HR divider --><center><font color="#8282e0"><b>_________________ _________________ _________________</b></font></center><br> <!-- BODY OF THE ARTICLE --> <A NAME="267lfindex0"> </A> <H2>Introduzione</H2> La shell UNIX costituisce un ambiente molto fertile di per sè stesso e lavora benissimo anche senza un'interfaccia grafica.<br> 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... <A NAME="267lfindex1"> </A> <H2>Approccio ad (X)dialog...</H2> 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.<br> Ecco un esempio: <br> Potete ridigitare (o fare un copia/incolla) le seguenti linee in una shell (xterm, konsole,....): <p class="code">bash<br> Xdialog --yesno "Do you want to learn more about Xdialog?" 0 0;\<br> case $? in<br> 0)<br> echo "Result: Yes chosen.";;<br> 1)<br> echo "Result: No chosen.";;<br> 255)<br> echo "ESC pressed.";;<br> esac<br> </p> Il riquadro che vi apparirà avrà più o meno quest'aspetto: <br> <center> <br> <img src="../../common/images/article267/yesno.gif" width= "274" height="95" alt="[yes/no Xdialog]"> </center> <br> 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. <br> <center> <br> <img src="../../common/images/article267/yesno_noX.gif" width="440" height="340" alt="[yes/no dialog]"> </center> <br> 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 <p class="code"><a href="../../common/src/article267/dialog_help.html"> dialog --help</a><br> oppure<br> <a href="../../common/src/article267/Xdialog_help.html"> Xdialog --help</a><br> </p> per avere una lista delle finestre disponibili. Xdialog ha qualche riquadro in più di dialog. <A NAME="267lfindex2"> </A> <H2>Come funziona</H2> I riquadri di dialog vengono configurati da linea di comando. <p class="code">dialog --yesno "text string" <height> <width></p> Una volta digitato "dialog" o "Xdialog" dovrete scrivere il nome del box che avete scelto, più i suoi parametri specifici. <br> <br> 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.<b> </b>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".<br> <br> Un esempio semplice ma efficace. <A NAME="267lfindex3"> </A> <H2>Un esempio pratico</H2> 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 <a href="../../March2001/article192.shtml"> Usare diversi ISP per il vostro accesso ad Internet</a>. Lo script si chiama <a href="../../common/src/article267/pppdialout.txt">pppdialout</a> e mostra diversi menu a seconda che si sia o meno connessi. <!-- translators: please do _not_ translate this script --> <pre> #!/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 </pre> <p><b>Come funziona lo script:</b><br> 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 è:</p> <p class="code">dialog --menu "text" <height> <width> <menu height> <tag1> <description> ...</p> 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: <p class="code">isp1 == isp2 == isp3 ==</p> 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. <br> <br> Ok, basta teoria. Qui vediamo come dovrebbe sembrare il tutto. <br> <br> <center> ... con una bella GTK GUI con Xdialog:<br> <br> <img src="../../common/images/article267/xdialog_1.gif" width="292" height="167" alt="[pppdialout with xdialog]"> <br> <img src="../../common/images/article267/xdialog_2.gif" width="274" height="95" alt="[pppdialout with xdialog]"> <br> <br> ... con la finestra di dialogo basata sulle curses nel terminale:<br> <br> <img src="../../common/images/article267/dialog_1.gif" width= "503" height="353" alt="[pppdialout with dialog]"> <br> <img src="../../common/images/article267/dialog_2.gif" width= "503" height="353" alt="[pppdialout with dialog]"> <br> <br> </center> <A NAME="267lfindex4"> </A> <H2>Più applicazioni </H2> 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. <p class="code">mktgz yourpackage .</p> Questo comando mostra tutti i file nella directory corrente (".") e potete selezionarna altre da includere nel vostro pacchetto vostropacchetto.tar.gz. Potete scaricare <a href="../../common/src/article267/mktgz.txt"> qui (mktgz.txt)</a> 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. <br> <br> 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. <A NAME="267lfindex5"> </A> <H2>Conclusioni</H2> 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: <pre>grep -i "somestring" file.txt | sort | uniq | wc -l<br></pre> <small>(per chi non avesse abbastanza esperienza con le shell UNIX: Questo comando conta quante linee del file file.txt contengono il termine "somestring")</small><br> 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.<br> 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.<br> <A NAME="267lfindex6"> </A> <H2>Dove trovare Xdialog e dialog?</H2> 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 è:<br> <a href="http://www.chez.com/godefroy/">http://www.chez.com/godefroy/</a><br> e dialog si trova su<br> <a href="http://hightek.org/dialog/">http://hightek.org/dialog/</a><br> Nel caso in cui non li abbiate trovati installati o nei vostri CD potrete anche cercarli nei loro siti ufficiali. <A NAME="267lfindex7"> </A> <H2>Riferimenti</H2> <ul> <li>Xdialog: <a href="http://www.chez.com/godefroy/">http://www.chez.com/godefroy/</a><br> dialog: <a href="http://hightek.org/dialog/">http://hightek.org/dialog/</a><br> </li> <li>Xdialog documentazione: <a href="http://www.chez.com/godefroy/doc/index.html"> http://www.chez.com/godefroy/doc/index.html</a><br> </li> <li> Altri articoli di LinuxFocus:<br> <ul> <li><a href="../../March2001/article192.shtml"> Using different ISPs for your Internet access</a><br> </li> <li><a href="../../September2001/article216.shtml"> Shell Programming</a><br> </li> </ul> </li> <li><a href="../../common/src/article267/pppdialout.txt"> pppdialout script</a></li> <li><a href="../../common/src/article267/mktgz.txt"> mktgz script</a></li> </ul> <!-- vim: set sw=2 ts=2 et tw=74: --> <!-- 2pdaIgnoreStart --> <A NAME="talkback"> </a> <h2>Discussioni su quest'articolo</h2> ogni articolo possiede una sua pagina di discussione, da questa pagina puoi inviare un commento o leggere quelli degli altri lettori: <center> <table border="0" CELLSPACING="2" CELLPADDING="1" summary="tb-button-outerpart"> <tr BGCOLOR="#C2C2C2"><td align=center> <table border="3" CELLSPACING="2" CELLPADDING="1" summary="tb-button"> <tr BGCOLOR="#C2C2C2"><td align=center> <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=267&lang=en"><b> pagina di discussione </b></a> </td></tr></table> </td></tr></table> </center> <HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="98%" summary="footer"> <TR><TD ALIGN=CENTER BGCOLOR="#9999AA" WIDTH="50%"> <A HREF="../../common/lfteam.html">Webpages maintained by the LinuxFocus Editor team</A> <BR><FONT COLOR="#FFFFFF">© Katja and Guido Socher, <a href="../../common/copy.html">FDL</a> <BR><a href="http://www.linuxfocus.org">LinuxFocus.org</a></FONT> <BR><a href="http://cgi.linuxfocus.org/cgi-bin/lfcomment?lang=it&article=article267.shtml" target="_TOP">Click here to report a fault or send a comment to LinuxFocus</A><BR></TD> <TD BGCOLOR="#9999AA"> <!-- TRANSLATION INFO --> <font size=2>Translation information:</font> <TABLE summary="translators"> <tr><td><font size="2">en --> -- : Katja and Guido Socher <small><katja(at)linuxfocusorg, %20guido(at)linuxfocus.org></small></font></td></tr> <tr><td><font size="2">en --> it: Kikko <kikko(at)linuxfocus.org></font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2002-12-27, generated by lfparser version 2.29</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>