[LinuxFocus-icon]
Домой  |  Карта  |  Индекс  |  Поиск

Новости | Архивы | Ссылки | Про LF
эта страница доступна на следующих языках: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Nederlands  Russian  Turkce  

[Photo of the Authors]
авторы Katja и Guido Socher
<katja(at)linuxfocusorg, guido(at)linuxfocus.org>

Об авторах:

Katja редактор немецкой секции. Ей нравится Tux, фильмы & фотография и море. Ее домашняя страница расположена здесь.

Guido давно увлекается Linux и ему нравится эта ОС, потому, что она разрабатывается настоящими профессионалами и открытыми людьми. Это одна из причин почему мы называем ее "open source". Его домашняя страница здесь linuxfocus.org/~guido.



Перевод на Русский:
Kirill Pukhlyakov <kirill(at)linuxfocusorg>

Содержание:

 

(X)dialog

[Illustration]

Резюме:

Xdialog и dialog две классические утилиты для добавления графического интерфейса к вашим shell скриптам.
Для понимания темы вам необходим небольшой опыт программирования shell. Вы можете сначала почитать эту заметку Shell Programming.

_________________ _________________ _________________

 

Вступление

Сам по себе UNIX shell достаточно мощный инструмент, но вы можете добавить к его функциональности еще и графический интерфейс.
Графический интерфейс может понадобиться вам например в установке какого-либо приложения - обычно может понадобиться список опций, каталог для установки и т.д..  

Познакомимся с (X)dialog...

Все что нужно для добавления GUI к вашему shell скрипту - несколько строк кода. Dialog это текстовый GUI, а Xdialog - графический ( X11 ).
Приведем небольшой пример :
Наберите следующий код :

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 из второй строки скрипта и вы увидите curses окно, которое появится в текущем терминале - во многих случаях этот вариант более подходит для shell скриптов, например в случае удаленного запуска скрипта без настроенного IP роутинга.

[yes/no dialog]

Этот пример достаточно бесполезный, но с его помощью мы показали как просто добавить GUI к скрипту. Можно добавить, что существует достаточно много интересных окон - календарь, меню, файлменеджер, прогрессбар, окно ввода, окно сообщения, парольное и т.д. Наберите

dialog --help
или
Xdialog --help

и вы получите полный список доступных окон. Добавим, что в Xdialog их немного больше.  

Как это работает

Окна настраиваются в командной строке.

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

Набрав dialog или Xdialog вам надо дать имя окна и передать параметры.

Окно yesno требует трех параметров. Если <height> и <width> будут установлены в '0' - размер окна автоматически подстроится под размер текста. Результат вернется в переменной "$?". Если надо вернуть больше значений ( например выбранные опции ) они вернутся в standard error - обычно на экран, но можно перенаправить с помощью ">2".

 

Реальные приложения

Рассмотрим реальное Xdialog/dialog приложение, имеющее преимущества над традиционным shell скриптом - меню выбора интернет провайдера и подключение к сети. Для корректной работы вам понадобятся ppp-on/ppp-off скрипты из мартовской заметки 2001 г. ( Использование разных провайдеров для доступа в Internet ). Скрипт называется pppdialout и показывает разные меню в зависимости от того подключены вы или нет сейчас к сети.
#!/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
Как работает скрипт :
В начале скрипта мы определяем функции error и help, затем проверяем переданные аргументы и название временного файла (/tmp/pppdialout.$$). $$ - имя текущего процесса. trap выполняется в случае ненормального завершения приложения ( например в случае нажатия пользователем crtl-C ) и удаляет временный файл в нашем случае. После этого идет проверка - онлайн мы или нет ( команда: /sbin/ifconfig | grep '^ppp' ). Если мы онлайн - показываем окно yesno ( его вы видели выше ), с вопросом об отключении. Если мы офлайн - показываем меню со списком провайдеров из каталога /etc/ppp/peers ( команда ls /etc/ppp/peers ). Синтаксис меню следующий :

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

Инициализируем <height>, <width> и <menu height> нулем ( авторазмер, см. выше ) далее приложение ожидает строки (<tag1> <description>). Мы передали нечто незначимое ( == ). Данные переменной isplist выглядят так :

isp1 == isp2 == isp3 ==

Результат выбора пользователя выводится в стандартный поток ошибок. Но команда "2> $tmpfile" перенаправляет его в наш временный файл ( tmpfile ). Окно меню позволяет выбрать действие "cancel". Поэтому нам надо контролировать переменную $?, чтобы знать выбор пользователя.

Ok, достаточно теории - посмотрим как это выглядит

... GTK GUI и Xdialog :

[pppdialout with xdialog]
[pppdialout with xdialog]

... curses окна в терминале :

[pppdialout with dialog]
[pppdialout with dialog]

 

Еще приложения

Мы подготовили еще одно приложение для вас и назвали его mktgz - как следует из названия оно предназначено для создания архивов tar.gz. Мы используем окно checklist, которое доступно только в Xdialog.

mktgz yourpackage .

Отображаются все файлы в текущем каталоге ( "." ) и вам предоставляется возможность выбрать те, которые вы хотите поместить в архив yourpackage.tar.gz. Вы можете скачать его здесь ( mktgz.txt ) Не будем его разбирать построчно - вы и сами уже достаточно знаете, чтобы понять как он работает.

Xdialog и dialog поставляются с каталогом "samples", где вы можете найти еще примеры ( в Redhat 7.3 смотрите каталог /usr/share/doc/Xdialog-2.0.5/samples). Будьте внимательны - некоторые из них совершают какие-то действия - не все они демо приложения.  

Вывод

Xdialog и dialog предоставляют множество стандартных окон, к сожалению не все они пригодны для shell скриптов. Еще раз скажем, что shell сам по себе мощный инструмент - иногда намного быстрее нажать клавишу "tab" в завершении вводимого пути, чем листать их в GUI. Особенно интересен механизм конвейера, позволяющий комбинировать команды, например так :
grep -i "somestring" file.txt | sort | uniq | wc -l
( для тех, кто еще не может понять эту команду : здесь подсчитываются уникальные строки в файле file.txt, которые содержат строку "somestring")
Такой конвейер возможен потому, что все включенные команды контролируют
Конечно есть место для применения dialog приложений, хотя они явно уступают настоящим графическим приложениям. Мы можем сказать, что dialog приложения заполняют пространство между shell скриптами и настоящими графическими приложениями.
 

Где взять Xdialog и dialog?

Во-первых посмотрите CD с вашим дистрибутивом linux. Возможно они уже установлены на ваш компьютер ( наберите команду : rpm -qil Xdialog, dpkg -L Xdialog ). Домашняя страница Xdialog :
http://www.chez.com/godefroy/
и dialog
http://hightek.org/dialog/
 

Ссылки

 

Страница отзывов

У каждой заметки есть страница отзывов. На этой странице вы можете оставить свой комментарий или просмотреть комментарии других читателей :
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Katja and Guido Socher, FDL
LinuxFocus.org
Translation information:
en --> -- : Katja and Guido Socher <katja(at)linuxfocusorg, guido(at)linuxfocus.org>
en --> ru: Kirill Pukhlyakov <kirill(at)linuxfocusorg>

2002-11-03, generated by lfparser version 2.31