<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=koi8-r"> <META NAME="GENERATOR" CONTENT="lfparser_2.31"> <META NAME="LFCATEGORY" CONTENT="UNIXBasics"> <link rel="icon" HREF="../../common/images/lf-16.png" TYPE="image/png"> <TITLE>lf267, UNIXBasics: (X)dialog</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 =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">Домой</FONT></A> | <A class= "nodec" href="../map.html"><FONT color= "#DDDDDD" size="2">Карта</FONT></A> | <A class= "nodec" href="../indice.html"><FONT color= "#DDDDDD" size="2">Индекс</FONT></A> | <A class="nodec" href="../Search/index.shtml"><FONT color= "#DDDDDD" size="2">Поиск</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">Новости</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color= "#FFFFFF">Архивы</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Links/index.shtml"><FONT color= "#FFFFFF">Ссылки</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color= "#FFFFFF">Про 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">эта страница доступна на следующих языках: <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> <img src="../../common/images/KatjaAndGuido.jpg" alt= "[Photo of the Authors]" height="150" width="168"> <BR>авторы Katja и Guido Socher <br> <small><katja(at)linuxfocusorg, guido(at)linuxfocus.org></small> <BR><BR> <I>Об авторах:</I><BR> <p>Katja редактор немецкой секции. Ей нравится Tux, фильмы & фотография и море. Ее домашняя страница расположена <a href="http://linuxfocus.org/~katja/">здесь</a>.</p><p>Guido давно увлекается Linux и ему нравится эта ОС, потому, что она разрабатывается настоящими профессионалами и открытыми людьми. Это одна из причин почему мы называем ее "open source". Его домашняя страница здесь <a href= "http://linuxfocus.org/~guido/">linuxfocus.org/~guido</a>.</p> <!-- TRANSLATED TO ru --> <BR><BR><I>Перевод на Русский:</I><BR> Kirill Pukhlyakov <small><kirill(at)linuxfocusorg></small> <br> <!-- =LF=TRANSTO=ru: Kirill Pukhlyakov --> <!-- TRANSLATED TO STOP --> <BR><i>Содержание</i>: <UL> <LI><A HREF="#267lfindex0">Вступление</A></LI> <LI><A HREF="#267lfindex1">Познакомимся с (X)dialog...</A></LI> <LI><A HREF="#267lfindex2">Как это работает</A></LI> <LI><A HREF="#267lfindex3">Реальные приложения</A></LI> <LI><A HREF="#267lfindex4">Еще приложения</A></LI> <LI><A HREF="#267lfindex5">Вывод</A></LI> <LI><A HREF="#267lfindex6">Где взять Xdialog и dialog?</A></LI> <LI><A HREF="#267lfindex7">Ссылки</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=267&lang=en">Страница отзывов</A></LI> </UL> </TD></TR></TABLE> <!-- HEAD OF THE ARTICLE --> <br> <H2>(X)dialog</H2> <img src="../../common/images/article267/shelltalk.jpg" width="200" height="202" alt="[Illustration]" hspace="10"> <!-- ABSTRACT OF THE ARTICLE --> <P><i>Резюме</i>: <P> Xdialog и dialog две классические утилиты для добавления графического интерфейса к вашим shell скриптам.<br> Для понимания темы вам необходим небольшой опыт программирования shell. Вы можете сначала почитать эту заметку <a href="../September2001/article216.shtml"> Shell Programming</a>. <br><!-- HR divider --><center><font color="#8282e0"><b>_________________ _________________ _________________</b></font></center><br> <!-- BODY OF THE ARTICLE --> <A NAME="267lfindex0"> </A> <H2>Вступление</H2> Сам по себе UNIX shell достаточно мощный инструмент, но вы можете добавить к его функциональности еще и графический интерфейс. <br> Графический интерфейс может понадобиться вам например в установке какого-либо приложения - обычно может понадобиться список опций, каталог для установки и т.д.. <A NAME="267lfindex1"> </A> <H2>Познакомимся с (X)dialog...</H2> Все что нужно для добавления GUI к вашему shell скрипту - несколько строк кода. Dialog это текстовый GUI, а Xdialog - графический ( X11 ).<br> Приведем небольшой пример : <br> Наберите следующий код : <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> В результате работы появится такое окно :<br> <center> <br> <img src="../../common/images/article267/yesno.gif" width= "274" height="95" alt="[yes/no Xdialog]"> </center> <br> Если вы используете dialog вместо Xdialog уберите X из второй строки скрипта и вы увидите curses окно, которое появится в текущем терминале - во многих случаях этот вариант более подходит для shell скриптов, например в случае удаленного запуска скрипта без настроенного IP роутинга. <br> <center> <br> <img src="../../common/images/article267/yesno_noX.gif" width="440" height="340" alt="[yes/no dialog]"> </center> <br> Этот пример достаточно бесполезный, но с его помощью мы показали как просто добавить GUI к скрипту. Можно добавить, что существует достаточно много интересных окон - календарь, меню, файлменеджер, прогрессбар, окно ввода, окно сообщения, парольное и т.д. Наберите <p class="code"><a href="../../common/src/article267/dialog_help.html">dialog --help</a><br> или<br> <a href="../../common/src/article267/Xdialog_help.html">Xdialog --help</a><br> </p> и вы получите полный список доступных окон. Добавим, что в Xdialog их немного больше. <A NAME="267lfindex2"> </A> <H2>Как это работает</H2> Окна настраиваются в командной строке. <p class="code">dialog --yesno "text string" <height> <width></p> Набрав dialog или Xdialog вам надо дать имя окна и передать параметры. <br><br> Окно yesno требует трех параметров. Если <height> и <width> будут установлены в '0' - размер окна автоматически подстроится под размер текста. Результат вернется в переменной "$?". Если надо вернуть больше значений ( например выбранные опции ) они вернутся в standard error - обычно на экран, но можно перенаправить с помощью ">2".<br> <br> <A NAME="267lfindex3"> </A> <H2>Реальные приложения</H2> Рассмотрим реальное Xdialog/dialog приложение, имеющее преимущества над традиционным shell скриптом - меню выбора интернет провайдера и подключение к сети. Для корректной работы вам понадобятся ppp-on/ppp-off скрипты из мартовской заметки 2001 г. ( <a href= "../March2001/article192.shtml">Использование разных провайдеров для доступа в Internet </a> ). Скрипт называется <a href= "../../common/src/article267/pppdialout.txt">pppdialout</a> и показывает разные меню в зависимости от того подключены вы или нет сейчас к сети. <!-- 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> <b>Как работает скрипт :</b><br> В начале скрипта мы определяем функции error и help, затем проверяем переданные аргументы и название временного файла (/tmp/pppdialout.$$). $$ - имя текущего процесса. trap выполняется в случае ненормального завершения приложения ( например в случае нажатия пользователем crtl-C ) и удаляет временный файл в нашем случае. После этого идет проверка - онлайн мы или нет ( команда: /sbin/ifconfig | grep '^ppp' ). Если мы онлайн - показываем окно yesno ( его вы видели выше ), с вопросом об отключении. Если мы офлайн - показываем меню со списком провайдеров из каталога /etc/ppp/peers ( команда ls /etc/ppp/peers ). Синтаксис меню следующий : <p class="code">dialog --menu "text" <height> <width> <menu height> <tag1> <description> ...</p> Инициализируем <height>, <width> и <menu height> нулем ( авторазмер, см. выше ) далее приложение ожидает строки (<tag1> <description>). Мы передали нечто незначимое ( == ). Данные переменной isplist выглядят так : <p class="code">isp1 == isp2 == isp3 ==</p> Результат выбора пользователя выводится в стандартный поток ошибок. Но команда "2> $tmpfile" перенаправляет его в наш временный файл ( tmpfile ). Окно меню позволяет выбрать действие "cancel". Поэтому нам надо контролировать переменную $?, чтобы знать выбор пользователя.<br> <br> Ok, достаточно теории - посмотрим как это выглядит <br><br> <center> ... GTK GUI и 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> ... curses окна в терминале :<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>Еще приложения</H2> Мы подготовили еще одно приложение для вас и назвали его mktgz - как следует из названия оно предназначено для создания архивов tar.gz. Мы используем окно checklist, которое доступно только в Xdialog. <p class="code">mktgz yourpackage .</p> Отображаются все файлы в текущем каталоге ( "." ) и вам предоставляется возможность выбрать те, которые вы хотите поместить в архив yourpackage.tar.gz. Вы можете скачать его <a href= "../../common/src/article267/mktgz.txt">здесь ( mktgz.txt )</a> Не будем его разбирать построчно - вы и сами уже достаточно знаете, чтобы понять как он работает. <br> <br> Xdialog и dialog поставляются с каталогом "samples", где вы можете найти еще примеры ( в Redhat 7.3 смотрите каталог /usr/share/doc/Xdialog-2.0.5/samples). Будьте внимательны - некоторые из них совершают какие-то действия - не все они демо приложения. <A NAME="267lfindex5"> </A> <H2>Вывод</H2> Xdialog и dialog предоставляют множество стандартных окон, к сожалению не все они пригодны для shell скриптов. Еще раз скажем, что shell сам по себе мощный инструмент - иногда намного быстрее нажать клавишу "tab" в завершении вводимого пути, чем листать их в GUI. Особенно интересен механизм конвейера, позволяющий комбинировать команды, например так : <pre>grep -i "somestring" file.txt | sort | uniq | wc -l </pre> <small>( для тех, кто еще не может понять эту команду : здесь подсчитываются уникальные строки в файле file.txt, которые содержат строку "somestring")</small><br> Такой конвейер возможен потому, что все включенные команды контролируют <br> Конечно есть место для применения dialog приложений, хотя они явно уступают настоящим графическим приложениям. Мы можем сказать, что dialog приложения заполняют пространство между shell скриптами и настоящими графическими приложениями.<br> <A NAME="267lfindex6"> </A> <H2>Где взять Xdialog и dialog?</H2> Во-первых посмотрите CD с вашим дистрибутивом linux. Возможно они уже установлены на ваш компьютер ( наберите команду : rpm -qil Xdialog, dpkg -L Xdialog ). Домашняя страница Xdialog :<br> <a href= "http://www.chez.com/godefroy/">http://www.chez.com/godefroy/</a><br> и dialog <br> <a href= "http://hightek.org/dialog/">http://hightek.org/dialog/</a><br> <A NAME="267lfindex7"> </A> <H2>Ссылки</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: <a href= "http://www.chez.com/godefroy/doc/index.html">http://www.chez.com/godefroy/doc/index.html</a><br> </li> <li> Другие заметки LinuxFocus:<br> <ul> <li><a href="../March2001/article192.shtml"> Использование разных провайдеров для доступа в Internet </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>Страница отзывов</h2> У каждой заметки есть страница отзывов. На этой странице вы можете оставить свой комментарий или просмотреть комментарии других читателей : <center> <table border="0" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <table border="3" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=267&lang=en"><b> talkback page </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> </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, guido(at)linuxfocus.org></small></font></td></tr> <tr><td><font size="2">en --> ru: Kirill Pukhlyakov <kirill(at)linuxfocusorg></font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2002-11-03, generated by lfparser version 2.31</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>