[LinuxFocus-icon]
Ê×Ò³  |  Õ¾µãµØÍ¼  |  Ë÷Òý  |  ËÑË÷

ÐÂÎÅ | ¹ýÍùÆÚ¿¯ | Á´½Ó | ¹ØÓÚLF
[an error occurred while processing this directive]
[Photo of the Authors]
by Katja and Guido Socher
<katja(at)linuxfocusorg, %20guido(at)linuxfocus.org>

About the authors:

Katja ÊÇLinuxFocusµÄµÂ¹ú±à¼­. Ëýϲ»¶Tux, µçÓ°, ÉãÓ°ºÍ´óº£. ÕâÀïÊÇËýµÄÖ÷Ò³.

Guido ÊÇÒ»¸ö³¤ÆÚlinux°®ºÃÕß. Ëûϲ»¶LinuxÒòΪËüÊÇÓɳÏʵºÍ¿ª·ÅµÄÈËÃÇÉè¼ÆµÄ. Õâ¾ÍÊÇÎÒÃdzÆÖ®Îª"¿ª·ÅÔ´´úÂë"µÄÔ­Òò. Õâ¶ùÊÇËûµÄÖ÷Ò³:linuxfocus.org/~guido.


Ŀ¼:


 

(X)dialog: Talking shells

[Illustration]

ÕªÒª:

XdialogºÍdialogÊÇÁ½ÖÖÄÜʹÄãµÄshell½Å±¾¾ß±¸Í¼ÐÎÓû§½çÃæ(GUI)µÄ¹¤¾ß.
ÄãÐèÒª¾ß±¸Ò»Ð©shell±à³Ì֪ʶ²ÅÄÜ¿´¶®ÕâÆªÎÄÕÂ. Äã¿ÉÒÔ¿´ÎÒÃǵÄShell ProgrammingÕâÆªÎÄÕÂÀ´Ñ§Ò»Ð©shell±à³ÌµÄ»ù´¡ÖªÊ¶.



 

¼ò½é

¼´Ê¹Ã»ÓÐͼÐÎÓû§½çÃæ, UNIX shell±¾Éí¾ÍÊÇÒ»¸ö·Ç³£ÓÐЧµÄ¹¤×÷»·¾³.
µ«Ä³Ð©Ô­ÒòʹµÃÓÐÒ»¸öͼÐεĶԻ°¿ò»áʹÓû§¾õµÃ¸ü¼ÓÖ±¹Û. ±ÈÈçÒ»¸ö³ÌÐòµÄ°²×°¶Ô»°¿ò. ÄãÓдóÁ¿µÄÑ¡ÏîÓÃÀ´Ñ¡Ôñ°²×°µÄÌØÕ÷,Äã¿ÉÒÔÑ¡ÔñÄ¿±êĿ¼....

 

ʹÓà (X)dialog...

ʹÓÃdialogºÍXdialogÄã½öÐèҪдһ¾ä¶Ì¶ÌµÄshell½Å±¾¾Í¿ÉÒÔʵÏÖÒ»¸öͼÐεϝӦÓóÌÐò. DialogÊÇÒ»¸öÍêÈ«ÒÀÀµÓÚÖն˵ijÌÐò,  XdialogÔòÊÇÒ»¸öX11³ÌÐò.
Õâ¶ùÓÐÒ»¸öÀý×Ó:
Äã¿ÉÒÔÊäÈë(»ò ¿½±¸/Õ³Ìù)ÏÂÃæÕâЩÓï¾äµ½Ò»¸ö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

ÔËÐнá¹û¿´ÆðÏñÕâÑù:

[yes/no Xdialog]

Èç¹ûÄãÓÃdialog´úÌæXdialog (°ÑÉÏÃæµÄ½Å±¾ÀïµÚ¶þÐÐµÄ X È¥µô), Äã¾Í¿ÉÒÔ¿´µ½Ò»¸öÔËÐÐÔÚxtermÀïµÄ»ùÓÚcursesµÄ³ÌÐò,¶ø²»ÊÇÒ»¸ö·ÖÀëµÄ´°¿ÚÀï(ÏÂͼ). ÔÚijЩÇé¿öÏÂ, ÕâÑùµÄÔËÐз½Ê½¸üÊʺÏÒ»¸ö½öÐèÒªÔÚÒ»¸öÖÕ¶Ë´°¿ÚÔËÐеĽű¾. ³ý·ÇÄãÏëÈÃËüÔËÐÐÔÚ¶ą̀ÎÞ·¨ÓëÄãÖ±½Ó·ÓɵÄÖ÷»úÉÏ. ÕâÖÖÇé¿öÏÂdialog¿ÉÒÔ˳ÀûÔËÐжøXdialogÔò²»ÄÜ.


[yes/no dialog]

ÉÏÃæÕâЩdialog/XdialogµÄÀý×ÓÆ¯ÁÁµ«ºÁÎÞÓô¦, µ«ËüÃÇ˵Ã÷Á˱àдһ¸öͼÐλ¯µÄ¶Ô»°¿òÊÇÈÝÒ×µÄ. »¹ÓÐÐí¶àÓÐȤµÄ¶Ô»°¿ò, °üÀ¨ÈçÈÕÀú,²Ëµ¥,Îļþ¹ÜÀíÆ÷,½ø¶ÈÌõ,Îı¾ÊäÈë,ÏûÏ¢¿ò,ÃÜÂë¿ò,.....Äã¿ÉÒÔÊÔ×ÅÔËÐÐ:

dialog --help
»òÕß
Xdialog --help

À´µÃµ½Ò»¸ö¿ÉÓõĶԻ°¿òÁбí. Xdialog ÓµÓеĶԻ°¿òÀàÐÍÒª±ÈdialogÉÙ.
 

ËüÊÇÈçºÎ¹¤×÷µÄ

ÕâЩ¶Ô»°¿òÊÇͨ¹ýÃüÁîÐÐÀ´¸ø¶¨²ÎÊýµÄ.

dialog --yesno "text string" <height> <width>

ÄãÊäÈëdialog »ò Xdialog ºó, ±ØÐë¸ø¶¨¶Ô»°¿òµÄÃû×ÖºÍÄãÏëÉèÖõÄÒ»ÒýÆðÌØÊâ²ÎÊý.

"yesno"¶Ô»°¿òÓÐ3¸ö²ÎÊý. <height>ºÍ<width>¿ÉÒÔÉèÖÃΪ0, ¶Ô»°¿ò»á¸ù¾ÝÎı¾µÄ³¤¶È×Ô¶¯µ÷Õû¿í¶ÈºÍ¸ß¶È. ½á¹û½«°Ñ¶Ô»°¿ò½áÊø×´Ì¬·µ»Ø¸ø½Å±¾²¢±£´æÔÚ"$?"±äÁ¿ÖÐ. Èç¹û»¹Óиü¶àµÄÖµÐèÒª·µ»Ø,È类ѡÏîµÄÃû×Ö, ÔòÕâ¸öÖµ»á±»·µ»Øµ½±ê×¼´íÎóÖÐ(standard error). ±ê×¼´íÎóͨ³£Ö»ÊDZ»´òÓ¡µ½ÆÁÄ»ÉÏ,µ«¿ÉÒÔÓÃ"2>"À´½øÐÐÖØ¶¨Ïò.

Ò»¸ö·Ç³£¼òµ¥¶øÓÐЧµÄ½â¾ö°ì·¨.
 

ÕæÕýµÄ³ÌÐò

ÏÖÔÚ,ÈÃÎÒÃÇÀ´¿´Ò»¸öʵÓõijÌÐò,Xdialog/dialog½«±È´«Í³µÄshell½Å±¾³ÌÐòÌṩ¸ü¶àµÄ±ãÀû: Ò»¸öÈÿÉÒÔÑ¡Ôñ²»Í¬µÄISP(Internet Service Providers)²¢ÇÒ½øÐÐÁ¬½ÓµÄ²Ëµ¥. Õâ¸ö½Å±¾ÐèÒª2001Äê5ÔµÄÎÄÕ Using different ISPs for your Internet access ÀïÌṩµÄppp-on/ppp-off½Å±¾. ÎÒÃÇÕâ¸ö½Å±¾½Ð×ö pppdialout, Ëü»á¸ù¾ÝÄãÊÇ·ñÔÚÏßÏÔʾ³ö²»Í¬µÄ²Ëµ¥.
#!/bin/sh
#
# pppdialout
#
#DIALOG=Xdialog
DIALOG=dialog
#
# ÄãµÄĬÈÏ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
}

# ·ÖÎöÃüÁîÐвÎÊý:
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

# ¼ì²éÊÇ·ñÒѾ­Á¬½Óinternet
if /sbin/ifconfig | grep '^ppp' > /dev/null; then
# ÎÒÃÇÒѾ­ÔÚÏß
$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
# û·¢ÏÖinternetÁ¬½Ó, ½øÐÐÁ¬½Ó
# ´Ó /etc/ppp/peers È¡µÃ¿ÉÓõÄISPÁбí
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
# pppdialout ½áÊø
Õâ¸ö½Å±¾ÊÇÈçºÎ¹¤×÷µÄ:
¿ªÊ¼,ÎÒÃǶ¨ÒåÁËһЩº¯Êý:errorºÍhelp, ÏÂÒ»²½ÎÒÃǼì²éÃüÁîÐвÎÊý,È»ºó¶¨ÒåÁËÒ»ÏàÁÙʱÎļþ(/tmp/pppdialout.$$). $$Êǵ±Ç°½øÐеÄÃû×Ö,ËüÔÚÿһ¸ö¼ÆËã»úÖж¼ÊǶÀÁ¢µÄ. Ïݾ®Óï¾äÔÚ³ÌÐò±»Ç¿ÖÆÖжÏ(ÈçÓû§°´ÏÂCtrl+C)ÊÇÖ´Ðв¢ÇÒɾ³ýÎÒÃǶ¨ÒåµÄÁÙʱÎļþ. È»ºóÎÒ¼ì²éÎÒÃÇÊÇ·ñÒѾ­ÔÚÏß(ÃüÁî:/sbin/ifconfig | grep '^ppp'). Èç¹ûÎÒÃÇÒѾ­ÔÚÏßÔò´ò¿ªÒ»¸ö¶Ô»°¿ò, ¾ÍÏñÉÏÃæÄãËù¿´µ½µÄÄÇÑù, ѯÎÊÓû§ÊÇ·ñÒª¶ÏÁ¬½Ó. Èç¹ûÎÒÃDz»ÔÚÏ߾ʹò¿ªÒ»¸ö²Ëµ¥¶Ô»°¿ò. ÎÒÃÇ´Ó /etc/ppp/peers (ls /etc/ppp/peers)ÖÐÈ¡µÃËùÓпÉÓõÄISPs. ²Ëµ¥¶Ô»°¿òµÄÓï·¨ÊÇ:

dialog --menu "text" <height> <width> <menu height> <tag1> <description> ...

<height>, <width> ºÍ<menu height> ±»ÉèÖÃΪ0(×Ô¶¯µ÷Õû,Çë¿´ÉÏÃæ),È»ºóÊdzÌÐòÔ¤¶¨µÄÓï·¨¸ñʽµÄ×Ö·û´®(<tag1> <description>). ÎÒÃÇûÓÐʲôÃèÊö,¾ÍÓÃÁËһЩÎÞÒâÒåµÄ¶«Î÷(==). ±äÁ¿ipslistÖеÄÊý¾Ý¿´ÆðÀ´ÏñÕâÑù:

isp1 == isp2 == isp3 ==

Óû§µÄÑ¡Ôñ½á¹û»á±»´òÓ¡µ½±ê×¼´íÎó. ÃüÁî"2> $tmpfile" °ÑÕâÒ»½á¹ûдµ½ÎÒÃǵÄÁÙʱÎļþ(tmpfile)Àï. Õâ¸ö²Ëµ¥¶Ô»°¿òÓÐcancel¿ÉÑ¡, ËùÒÔÎÒÃDZØÐë¼ì²é $? (Í˳ö״̬) ÒÔÈ·¶¨ÄÇÒ»¸ö¼ü±»°´ÏÂ.

ºÃÀ², ÀíÂÛÒѾ­×ã¹». ½á¹û¿´ÆðÀ´ÊÇÕâÑù:

... Xdialog²úÉúµÄƯÁÁµÄGTKͼÐνçÃæ:

[pppdialout with xdialog]
[pppdialout with xdialog]

... ÖÕ¶ËÀï»ùÓÚ curses µÄ dialog :

[pppdialout with dialog]
[pppdialout with dialog]

 

¸ü¶àµÄ³ÌÐòMore applications

ÎÒÃÇ»¹ÓÐÁíÒ»¸ö³ÌÐòÒªÏ׸øÄã. ËüÊÇÒ»¸ö½Ð×ömktgzµÄʹÓÃXdialogµÄchecklist¶Ô»°¿òµÄ³ÌÐò. »ùÓÚÆ½ÃæÖն˵ÄdialogûÓÐchecklist¶Ô»°¿ò,ËùÒÔËüÖ»ÄÜʹÓÃXdialogÁË. Äã¿ÉÒÔÓà mktgzÀ´½¨Á¢ tar.gz µÄѹËõ°ü. Ó÷¨:

mktgz yourpackage .

Õâ¸ö³ÌÐò»áÏÔʾµ±Ç°Ä¿Â¼(".")ϵÄËùÓÐÎļþ, È»ºóÄã¿ÉÒÔÑ¡ÔñÄÄЩÎļþÐèÒª¼ÓÈëµ½yourpackage.tar.gz °üÖÐ. Äã¿ÉÒÔÔÚÕâÀïÏÂÔØÕâ¸ö³ÌÐò(mktgz.txt). ÎÒÃDz»ËãÒ»¾äÒ»¾äµÄ½âÊÍÕâ¸ö½Å±¾,ÒòΪÄãÒѾ­Äܹ»¶Á¶®Õâ¸ö½Å±¾ÁË.

Xdialog ºÍ dialog ×Ô´øµÄһЩÀý×ÓÔÚÒ»¸ö½Ð"samples"µÄĿ¼Àï(Redhat 7.3 ÀïÔÚ /usr/share/doc/Xdialog-2.0.5/samplesÏÂ). Çë×¢ÒâÕâЩ½Å±¾²»½ö½öÊÇ×öÑÝʾ, ËüÃÇ»áÕæµÄÈ¥×öһЩÊÂÇé.

 

×ܽá

Xdialog ºÍ dialog ÌṩÁË´óÁ¿µÄ¶Ô»°¿òÀàÐÍ. ËùÓÐÕâЩÀàÐ͵ĶԻ°¿ò²¢²»ÊʺÏËùÓÐÀàÐ͵Ľű¾. shell ±¾Éí¾ÍÊÇÒ»¸ö"Ç¿´ó"µÄ»·¾³. ÓÃtab¼üÀ´×Ô¶¯²¹È«Ä¿Â¼±ÈÔÚͼÐÎÓû§½çÃæÖеã»÷ËüÃÇÒª¿ìºÜ¶à. ÌØ±ðÊǹܵÀºÍ×éºÏÃüÁî¸üÊÇÒ»¸öÇ¿´óµÄ¹¤¾ß. ¾ÍÏñÕâÑù:

grep -i "somestring" file.txt | sort | uniq | wc -l

(UNIXµÄshellsÒª×öͬÑùµÄÊÂÔòûÓÐÕâôÈÝÒ×: ¼ÆËãfile.txtÀï°üº¬"somestring"×Ö´®µÄÐеÄÊýÄ¿)
¿ÉÒÔÓÃÕâÖֹܵÀ½á¹¹ÊÇÒòΪÕâЩÃüÁîÈ«ÓÉÃüÁîÐвÎÊýÀ´¿ØÖÆ. »»¾ä»°Ëµ: ËüÃDz»»áÍ£ÏÂÀ´ÎÊÓû§Ëü½«ÈçºÎ¼ÌÐøÔËÐÐ.
ËäÈ»ÔÚ³ÌÐòÖÐͼÐζԻ°¿ò·Ç³£ÓÐÓÃ, Xdialog ºÍ dialog ·Ç³£Ò×ÓÚʹÓÃ, µ«±Ø¾¡Ã»ÓÐÕæÕýµÄͼÐλ¯³ÌÐòÇ¿´ó. ËüÃÇÌî²¹Ò»´¿ASCII shell½Å±¾ºÍȫͼÐλ¯³ÌÐòÕâ¼äµÄȱ¿Ú.  

ÔÚÄÇÀïÏÂÔØ Xdialog ºÍ dialog?

Ê×ÏÈ¿ÉÒÔÕҵĵط½ÊÇÄãµÄlinux·¢Ðаæ¹âÅÌÀï. Ò²ÐíÒѾ­°²×°µ½ÁËÄãµÄ¼ÆËã»úÀï(²éѯÄãµÄ¼ÆËã»ú: Èç rpm -qil Xdialog, dpkg -L Xdialog). XdialogµÄÖ÷Ò³ÊÇ:
http://www.chez.com/godefroy/
dialogµÄÖ÷Ò³ÊÇ:
http://hightek.org/dialog/
ÄãÒ²¿ÉÒÔÕâÀïÏÂÔØ dialog/Xdialog.
 

²Î¿¼×ÊÁÏ

 

¶ÔÕâÆªÎÄÕ·¢±íÆÀÂÛ

ÿƪÎÄÕ¶¼Óи÷×Եķ´À¡Ò³Ãæ¡£ÔÚÕâ¸öÒ³ÃæÀÄú¿ÉÒÔÌá½»ÆÀÂÛ£¬Ò²¿ÉÒԲ鿴ÆäËû¶ÁÕߵįÀÂÛ£º
 ·´À¡Ò³Ãæ 

Ö÷Ò³ÓÉLinuxFocus±à¼­×éά»¤
© Katja and Guido Socher, FDL
LinuxFocus.org

µã»÷ÕâÀïÏòLinuxFocus±¨¸æ´íÎó»òÌá³öÒâ¼û
·­ÒëÐÅÏ¢:
en --> -- : Katja and Guido Socher <katja(at)linuxfocusorg, %20guido(at)linuxfocus.org>
en --> zh: Walte YH <walteyh(at)sohu.com>

2003-04-06, generated by lfparser version 2.25