[an error occurred while processing this directive]
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
ÕªÒª:
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
ÔËÐнá¹û¿´ÆðÏñÕâÑù:
Èç¹ûÄãÓÃdialog´úÌæXdialog (°ÑÉÏÃæµÄ½Å±¾ÀïµÚ¶þÐÐµÄ X È¥µô), Äã¾Í¿ÉÒÔ¿´µ½Ò»¸öÔËÐÐÔÚxtermÀïµÄ»ùÓÚcursesµÄ³ÌÐò,¶ø²»ÊÇÒ»¸ö·ÖÀëµÄ´°¿ÚÀï(ÏÂͼ).
ÔÚijЩÇé¿öÏÂ, ÕâÑùµÄÔËÐз½Ê½¸üÊʺÏÒ»¸ö½öÐèÒªÔÚÒ»¸öÖÕ¶Ë´°¿ÚÔËÐеĽű¾. ³ý·ÇÄãÏëÈÃËüÔËÐÐÔÚ¶ą̀ÎÞ·¨ÓëÄãÖ±½Ó·ÓɵÄÖ÷»úÉÏ.
ÕâÖÖÇé¿öÏÂdialog¿ÉÒÔ˳ÀûÔËÐжøXdialogÔò²»ÄÜ.
ÉÏÃæÕâЩ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]](../../common/images/article267/xdialog_1.gif)
![[pppdialout with xdialog]](../../common/images/article267/xdialog_2.gif)
... ÖÕ¶ËÀï»ùÓÚ curses
µÄ dialog :
![[pppdialout with dialog]](../../common/images/article267/dialog_1.gif)
![[pppdialout with dialog]](../../common/images/article267/dialog_2.gif)
¸ü¶àµÄ³ÌÐò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.
²Î¿¼×ÊÁÏ
¶ÔÕâÆªÎÄÕ·¢±íÆÀÂÛ
ÿƪÎÄÕ¶¼Óи÷×Եķ´À¡Ò³Ãæ¡£ÔÚÕâ¸öÒ³ÃæÀÄú¿ÉÒÔÌá½»ÆÀÂÛ£¬Ò²¿ÉÒԲ鿴ÆäËû¶ÁÕߵįÀÂÛ£º
2003-04-06, generated by lfparser version 2.25