dialog — это утилита для построения консольных интерфейсов. Xdialog — аналогичная программа для X. Обе программы более-менее совместимы и легко интегрируются в скрипты. Dialog входит в состав большинства дистрибутивов GNU/Linux. Программа Xdialog доступна на сайте.
Основы
Вот первый скрипт, он просто выводит диалог с кнопками «Да» и «Нет».
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash DIALOG=${DIALOG=dialog} $DIALOG --title " Мой первый диалог" --clear \ --yesno "Привет! Перед вами пример программы,\ nиспользующей dialog" 10 40 case $? in 0) echo "Выбрано 'Да'.";; 1) echo "Выбрано 'Нет'.";; 255) echo "Нажата клавиша ESC.";; esac |
для выполнения скрипта нужно установить права на выполнение
|
1 |
<span class="re1">$chmod</span> u+x <имя файла> |
результат
Первая строка является комментарием, который также указывает, что для выполнения требуется командный интерпретатор bash.
Последовательность
#!в мире Unix называется sha-bang. Она указывает системе какой именно интерпретатор следует использовать для исполнения сценария — http://gazette.linux.ru.net/rus/articles/abs-guide/c112.html.
Эта строка присваивает переменной DIALOG значение ‘dialog’. Сам же диалог формируется следующей строкой:
|
1 2 |
$DIALOG --title "Мой первый диалог" --clear \ --yesno "Привет! Перед вами пример программы,\n использующей dialog" 10 40 |
Применяемые опции:
- —title
- задает заголовок диалога;
- —clear
- очищает экран перед отображением диалога;
- —yesno
- задает тип диалога и текст для отображения.
Выводимый текст нужно брать в двойные кавычки. Текст переносится в зависимости от ширины диалогового окна. Можно использовать символ \n для указания принудительного перевода строки. Последние два числа задают ширину и высоту диалога.
Размеры окна задаются в символах. Это верно как для dialog, так и Xdialog. При этом для вывода текстовой информации Xdialog использует моноширинный шрифт.
Между кнопками можно переключатся при помощи клавиши табуляции.
Теперь программа ждет пользовательского выбора. В зависимости от того, нажмете кнопку «Да» или «Нет», или нажмете клавишу Esc, переменная командного интерпретатора $? будет содержать код завершения программы, который можно так или иначе обработать.
Ввод данных
Следующий скрипт ожидает ввода строки и затем отображает ее на экране.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/sh DIALOG=${DIALOG=dialog} tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$ trap "rm -f $tempfile" 0 1 2 5 15 $DIALOG --title "Ввод данных" --clear \ --inputbox "Привет! Перед вами пример ввода даных\nВведите свое имя:" 16 51 2> $tempfile retval=$? case $retval in 0) echo "Вы ввели `cat $tempfile`" ;; 1) echo "Отказ от ввода.";; 255) if test -s $tempfile ; then cat $tempfile else echo "Нажата клавиша ESC." fi ;; esac |
результат
Очень полезная фича — определить временный файл и его удаление при завершении программы:
|
1 2 |
tempfile=`mktemp 2>/dev/null` || tempfile=/tmp/test$$ trap "rm -f $tempfile" 0 1 2 5 15 |
В оригинальном скрипте для формирования имени временного файла использовалась утилита tempfile, но такую обнаружить не удалось, поэтому пришлось ее заменить на mktemp. Хотя скрипт работать будет в любом случае, т.к. в случае ошибки конструкция || позволяет сформировать имя файла вида /tmp/test$$, где $$ — PID текущего процесса. Хотя, на мой взгляд, корректнее было бы использовать переменную $RANDOM.
В первой строке делается попытка создать временный файл с помощью утилиты mktemp. Если это не получается, он создается вручную, в каталоге /tmp. Вторая строка определяет обработчик сигналов. При завершении скрипта (вне зависимости, корректном или не корректном) обработчик удаляет временный файл. Числа — это номера обрабатываемых сигналов.
После этого вызывается программа dialog:
|
1 2 |
$DIALOG --title "Ввод данных" --clear \ --inputbox "Привет! Перед вами пример ввода даных\nВведите свое имя:" 16 51 2> $tempfile |
Программа по умолчанию выводит результат в файл ошибок stderr (стандартный поток вывода ошибок). Благодаря этому вы можете перехватить введенный текст для последующей его обработки.
Диалог выбора одного из пунктов
-
1234567891011121314151617181920212223242526#!/bin/shDIALOG=${DIALOG=dialog}tempfile=`mktemp 2>/dev/null` || tempfile=/tmp/test$$trap "rm -f $tempfile" 0 1 2 5 15$DIALOG --clear --title "Мои любимые исполнители" \--menu "Все любят песни хинди, поэтому выбирайте:" 20 51 4 \"Rafi" "Mohammed Rafi" \"Mukesh" "Mukesh" \"Kishore" "Kishore Kumar" \"Saigal" "K L Saigal" \"Lata" "Lata Mangeshkar" \"Yesudas" "K J Yesudas" 2> $tempfileretval=$?choice=`cat $tempfile`case $retval in0)echo "Да вы эстет! '$choice' -- это лучшее, что вы слышали в своей жизни!";;1)echo "Отказ от ввода.";;255)echo "Нажата клавиша ESC.";;esac
результат выполнения скрипта перенаправляется во временный файл, откуда он может быть взят для дальнейшей обработки.
Списки зависимых кнопок (radiolist) и флажков (checklist)
Формирование таких списков аналогично организации меню.
-
1234567891011121314151617181920212223242526#! /bin/shDIALOG=${DIALOG=dialog}tempfile=`mktemp 2>/dev/null` || tempfile=/tmp/test$$trap "rm -f $tempfile" 0 1 2 5 15$DIALOG --backtitle "Не стесняйтесь, выберите любимого певца" \--title "Выбор исполнителя" --clear \--radiolist "Мой любимый певец, это... " 20 61 5 \"Rafi" "Mohammed Rafi" off \"Lata" "Lata Mangeshkar" ON \"Hemant" "Hemant Kumar" off \"Dey" "MannaDey" off \"Kishore" "Kishore Kumar" off \"Yesudas" "K. J. Yesudas" off 2> $tempfileretval=$?choice=`cat $tempfile`case $retval in0)echo "Ого! Кто бы мог подумать, но выбор пал на '$choice'";;1)echo "Отказ от ввода.";;255)echo "Нажата клавиша ESC.";;esac
Можете взглянуть на скриншоты —
Для того, чтобы использовать список флажков, вместо радиокнопок, замените в скрипте опцию --radiolist на --checklist.
Создание индикатора
прогрессбар
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/bin/sh DIALOG=${DIALOG=dialog} COUNT=10 ( while test $COUNT != 110 do echo $COUNT echo "XXX" echo "Новое сообщение ($COUNT процентов)" echo "Строка 2" echo "XXX" COUNT=`expr $COUNT + 10` sleep 1 done ) | $DIALOG --title "Индикатор" --gauge "А вот пример простейшего индикатора" 20 70 0 |
Особенность реализации индикатора заключается в том, что программа dialog получает данные через конвейер от кода, который заключен внутри круглых скобок. Есть два момента, на которые необходимо обратить внимание. Первый — это обязательное использование переменной $COUNT. Именно из неё dialog считывает текущее значение индикатора. При этом желательно, чтобы значение переменной колебалось в диапазоне от 0 до 100. Второй — это использование строк вида «XXX» в качестве ограничителей сообщения, выводящегося на экран
Выбор файла
Вот пример простейшего диалога для выбора файла
-
12345678910111213#!/bin/shDIALOG=${DIALOG=dialog}FILE=`$DIALOG --stdout --title "Выберите файл" --fselect $HOME/ 10 60`case $? in0)echo "Выбран \"$FILE\"";;1)echo "Отказ от ввода.";;255)echo "Нажата клавиша ESC.";;esac
Обратите внимание, что в этом примере используется другой механизм получения данных от dialog. По умолчанию большинство элементов, представленных в dialog, возвращают значение через stderr, поэтому в предыдущих примерах использовалось перенаправление данных с stderr в файл. Используя опцию --stdout, можно сразу перенаправлять данные на стандартный вывод, что и демонстрируется в последнем примере.
Диалоговое окно для выбора файла состоит из панелей. Вы можете перемещаться между ними при помощи клавиши Tab. Кроме этого, у вас есть возможность вводить данные непосредственно в строке ввода, расположенной под панелями.
Календарь и настройка часов
Календарь
Информация о годе, месяце и дне выводится на отдельных панелях. Если значение дня, месяца или года не указано, либо оно отрицательное, то используется системная дата.
Для изменения значений можно использовать стрелки управления курсором, либо воспользоваться горячими клавишами, используемыми в vi при навигации по тексту: H, J, K и L.
Если год устанавливается равным 0, то по умолчанию используется значение текущего года. Результат выводится в формате день/месяц/год
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/sh DIALOG=${DIALOG=dialog} USERDATE=`$DIALOG --stdout --title "Календарь" --calendar "Выберите дату..." 0 0 7 7 1981` case $? in 0) echo "Выбрано: $USERDATE.";; 1) echo "Отказ от ввода.";; 255) echo "Нажата клавиша ESC.";; esac |
Настройка часов
Этот диалог позволяет вам выбирать время (см. рисунок)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/sh DIALOG=${DIALOG=Xdialog} USERTIME=`$DIALOG --stdout --title "Настройка часов" --timebox "Укажите,пожалуйста, время..." 0 0 12 34 56` case $? in 0) echo "Указано время: $USERTIME.";; 1) echo "Отказ от ввода.";; 255) echo "Нажата клавиша ESC.";; esac |
Опции утилиты, отвечающие за вид диалогового окна:
-
—buildlist — диалоговое окно списка сборки, отображающее списки с невыбранными и выбранными элементами. Синтаксис диалогового окна имеет вид:
--buildlist <text> <height> <width> <list-height> <tag1> <item1> <status1>...; -
—calendar — диалоговое окно календаря, отображающее день, месяц или год. Синтаксис диалогового окна имеет вид:
--calendar <text> <height> <width> <day> <month> <year>; -
—checklist — диалоговое окно контрольного списка. Синтаксис диалогового окна имеет вид:
--checklist <text> <height> <width> <list height> <tag1> <item1> <status1>...; -
—dselect — диалоговое окно выбора каталога. Синтаксис диалогового окна имеет вид:
--dselect <directory> <height> <width>; -
—editbox — диалоговое окно редактирования. Синтаксис диалогового окна имеет вид:
--editbox <file> <height> <width>; -
—form — диалоговое окно формы. Синтаксис диалогового окна имеет вид:
--form <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...; -
—fselect — диалоговое окно выбора файла. Синтаксис диалогового окна имеет вид:
--fselect <filepath> <height> <width>; -
—gauge — диалоговое окно индикатора. Синтаксис диалогового окна имеет вид:
--gauge <text> <height> <width> [<percent>]; -
—infobox — информационное окно. Синтаксис диалогового окна имеет вид:
--infobox <text> <height> <width>; -
—inputbox — диалоговое поле ввода данных от пользователя. Синтаксис диалогового окна имеет вид:
--inputbox <text> <height> <width> [<init>]; -
—inputmenu — диалоговое окно меню ввода. Синтаксис диалогового окна имеет вид:
--inputmenu <text> <height> <width> <menu height> <tag1> <item1>...; -
—menu — диалоговое окно меню. Синтаксис диалогового окна имеет вид:
--menu <text> <height> <width> <menu height> <tag1> <item1>...; -
—mixedform — диалоговое окно смешанной формы, состоящее из меток и полей. Синтаксис диалогового окна имеет вид:
--mixedform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1> <itype>...; -
—mixedgauge — диалоговое окно смешанного счетчика. Синтаксис диалогового окна имеет вид:
--mixedgauge <text> <height> <width> <percent> <tag1> <item1>...; -
—msgbox — диалоговое окно сообщения. Синтаксис диалогового окна имеет вид:
--msgbox <text> <height> <width>; -
—passwordbox — диалоговое поле пароля. Синтаксис диалогового окна имеет вид:
--passwordbox <text> <height> <width> [<init>]; -
—passwordform — диалоговое окно формы с вводом пароля. Синтаксис диалогового окна имеет вид:
--passwordform <text> <height> <width> <form height> <label1> <l_y1> <l_x1> <item1> <i_y1> <i_x1> <flen1> <ilen1>...; -
—pause — диалоговое окно паузы. Синтаксис диалогового окна имеет вид:
--pause <text> <height> <width> <seconds>; -
—prgbox — диалоговое окно для отображения вывода команды. Синтаксис диалогового окна имеет вид:
--prgbox <text> <command> <height> <width>; -
—programbox — диалоговое окно программного блока. Синтаксис диалогового окна имеет вид:
--programbox <text> <height> <width>; -
—progressbox — диалоговое окно прогресса. Синтаксис диалогового окна имеет вид:
--progressbox <text> <height> <width>; -
—radiolist — диалоговое окно радиосписка. Синтаксис диалогового окна имеет вид:
--radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>...; -
—rangebox — диалоговое окно с выбором диапазона значений. Синтаксис диалогового окна имеет вид:
--rangebox <text> <height> <width> <min-value> <max-value> <default-value>; -
—tailbox — диалоговое окно отображения текста из файла. Синтаксис диалогового окна имеет вид:
--tailbox <file> <height> <width>; -
—tailboxbg — диалоговое окно отображения текста из файла в качестве фоновой задачи. Синтаксис диалогового окна имеет вид:
--tailboxbg <file> <height> <width>; -
—textbox — диалоговое окно с текстовым полем. Синтаксис диалогового окна имеет вид:
--textbox <file> <height> <width>; -
—timebox — диалоговое окно, позволяющее выбрать время. Синтаксис диалогового окна имеет вид:
--timebox <text> <height> <width> <hour> <minute> <second>; -
—treeview — диалоговое окно отображения данных в виде дерева. Синтаксис диалогового окна имеет вид:
--treeview <text> <height> <width> <list-height> <tag1> <item1> <status1> <depth1>...; -
—yesno — диалоговое окно «Да»/«Нет». Синтаксис диалогового окна имеет вид:
--yesno <text> <height> <width>.
Другие возможности
Кроме этого, Xdialog располагает такими элементами, как деревья (tree-view), выбор значения из заданного диапазона (range-box), редактор текстовых файлов (edit-box) и т.п. Не забудьте заглянуть в справочное руководство для dialog — оно содержит интересную информацию о таких возможностях как ввод пароля (password box), просмотр файла (tailbox) и т.д. Также у вас есть возможность манипулировать внешним видом окна, меняя цвета, добавляя/убирая тени и т.п.
Ссылки
-
Страницы справочного руководства dialog: http://hightek.org/dialog/manual-0.9a-20010429.html
Обязательно прочтите их (или man dialog), если планируете писать скрипты, используя dialog. -
Примеры скриптов: http://www.fifi.org/doc/dialog/examples/.
Все примеры, представленные здесь, являются модифицированными скриптами, взятыми по этому адресу. Если вы используете Debian GNU/Linux, то эти примеры вы найдёте в /usr/share/doc/dialog/examples. -
Документация по Xdialog: http://thgodef.nerim.net/xdialog/doc/index.html.
На этой странице вы найдёте полную информацию о функциональных возможностях Xdialog.








