Dialog

  • apt-get install dialog
  • brew install dialog
  • yum install dialog

dialog это утилита для построения консольных интерфейсов. Dialog входит в состав большинства дистрибутивов GNU/Linux. Если вы хотите собрать её из исходников, то архив можно найти на http://hightek.org/dialog/.

Эта программа являются свободными и работают на большом количестве платформ *nix. Большинство приведённых примеров в данном руководстве являются адаптацией примеров, поставляемых с исходными кодами программ.

Вот первый скрипт, работу которого я проверил. Он просто выводит диалог с кнопками "Да" и "Нет".

#!/bin/bash
DIALOG=${DIALOG=dialog}
 
$DIALOG --title " Мой первый диалог" --clear \
        --yesno "Привет! Перед вами пример программы,\nиспользующей (X)dialog" 10 40
 
case $? in
    0)
        echo "Выбрано 'Да'.";;
    1)
        echo "Выбрано 'Нет'.";;
    255)
        echo "Нажата клавиша ESC.";;
esac

Применяемые опции:

  • --title задаёт заголовок диалога
  • --clear очищает экран перед отображением диалога
  • --yesno задаёт тип диалога и текст для отображения.

Следующая программа ожидает ввода строку и затем отображает её на экране.

#!/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

Следующая программа позволяет вам организовать список с возможностью выбора одного из элементов:

#!/bin/sh
DIALOG=${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> $tempfile
 
retval=$?
 
choice=`cat $tempfile`
 
case $retval in
  0)
    echo "Да вы эстет! '$choice' -- это лучшее, что вы слышали в своей жизни!";;
  1)
    echo "Отказ от ввода.";;
  255)
    echo "Нажата клавиша ESC.";;
esac
#!/usr/bin/env bash
 
t(){ type "$1"&>/dev/null;}
 
function Menu.Show {
   local DIA DIA_ESC; while :; do
      t whiptail && DIA=whiptail && break
      t dialog && DIA=dialog && DIA_ESC=-- && break
      exec date +s"No dialog program found"
   done; declare -A o="$1"; shift
 
   $DIA --backtitle "${o[backtitle]}" --title "${o[title]}" \
      --menu "${o[text]}" 0 0 0 $DIA_ESC "$@"; 
}
 
Menu.Show '([backtitle]="Backtitle"
            [title]="Title"
            [question]="Please choose:")'          \
                                                   \
            "Option A"  "Stuff...."                \
            "Option B"  "Stuff...."                \
            "Option C"  "Stuff...."    
$ dialog --checklist "Preferred Linux distros" 15 40 5\
               debian "Venerable Debian" off \
               ubuntu "Popular Ubuntu"   on  \
               fedora "Hackish Fedora"   off \
               centos "Stable Centos"    off \
               mint "Rising Star Mint"   off 2>distrochoice
$ dialog --title Habr --checklist «Simple checkbox menu» 12 35 3 $(echo {hello,habra,habr}" '' 0" 

Формирование таких списков аналогично организации меню, описанного в предыдущем разделе.

#! /bin/sh
DIALOG=${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> $tempfile
 
retval=$?
 
choice=`cat $tempfile`
case $retval in
  0)
    echo "Ого! Кто бы мог подумать, но выбор пал на '$choice'";;
  1)
    echo "Отказ от ввода.";;
  255)
    echo "Нажата клавиша ESC.";;
esac

Для того, чтобы использовать список флажков, вместо радиокнопок, замените в скрипте опцию --radiolist на --checklist.

Такой элемент позволяет визуализировать процесс выполнения вашего скрипта:

#!/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
#!/bin/sh
 
(
c=10
while [ $c -ne 110 ]
    do
        echo $c
        ((c+=10))
        sleep 1
done
) |
dialog --title " Тест диалога прогресса " --gauge "Please wait ...." 10 60 0
 
clear

Вот пример простейшего диалога для выбора файла:

#!/bin/sh
DIALOG=${DIALOG=dialog}
 
FILE=`$DIALOG --stdout --title "Выберите файл" --fselect $HOME/ 10 60`
 
case $? in
    0)
        echo "Выбран \"$FILE\"";;
    1)
        echo "Отказ от ввода.";;
    255)
        echo "Нажата клавиша ESC.";;
esac

Информация о годе, месяце и дне выводится на отдельных панелях. Если значение дня,месяца или года не указано, либо оно отрицательное, то используются системная дата. (Работает только в dialog. Указать в качестве начального значения , например, 1000-й год не получится -- dialog воспринимает это как неверное значение и указывает текущую дату. Для изменения значений можно использовать стрелки управления курсором, либо воспользоваться горячими клавишами, используемыми в vi при навигации по тексту: h, j, k и l. Если год устанавливается равным 0, то по умолчанию используется значение текущего года. Результат выводится в формате день/месяц/год

#!/bin/sh
DIALOG=${DIALOG=dialog}
 
USERDATE=`$DIALOG --stdout --title "Календарь" --calendar "Выберите дату..." 00 7 7 1981`
 
case $? in
  0)
    echo "Выбрано: $USERDATE.";;
  1)
    echo "Отказ от ввода.";;
  255)
    echo "Нажата клавиша ESC.";;
esac

Этот диалог позволяет вам выбирать время:

#!/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

Ваш скрипт сможет самостоятельно делать выбор между dialog и Xdialog, если в его начале дописать следующую конструкцию:

if [ -z $DISPLAY ]
then
    DIALOG=dialog
else
    DIALOG=Xdialog
fi