<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>https://wiki.mna.tom.ru/index.php?action=history&amp;feed=atom&amp;title=Shell_dialog</id>
		<title>Shell dialog - История изменений</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.mna.tom.ru/index.php?action=history&amp;feed=atom&amp;title=Shell_dialog"/>
		<link rel="alternate" type="text/html" href="https://wiki.mna.tom.ru/index.php?title=Shell_dialog&amp;action=history"/>
		<updated>2026-05-18T10:54:15Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.27.7</generator>

	<entry>
		<id>https://wiki.mna.tom.ru/index.php?title=Shell_dialog&amp;diff=173&amp;oldid=prev</id>
		<title>Admin: Новая страница: «category:Linux '''Команда zenity''' Команда zenity выводит на рабочий стол интерактивные диалоговые…»</title>
		<link rel="alternate" type="text/html" href="https://wiki.mna.tom.ru/index.php?title=Shell_dialog&amp;diff=173&amp;oldid=prev"/>
				<updated>2017-03-15T07:16:49Z</updated>
		
		<summary type="html">&lt;p&gt;Новая страница: «&lt;a href=&quot;/index.php/%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:Linux&quot; title=&quot;Категория:Linux&quot;&gt;category:Linux&lt;/a&gt; &amp;#039;&amp;#039;&amp;#039;Команда zenity&amp;#039;&amp;#039;&amp;#039; Команда zenity выводит на рабочий стол интерактивные диалоговые…»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:Linux]]&lt;br /&gt;
'''Команда zenity'''&lt;br /&gt;
Команда zenity выводит на рабочий стол интерактивные диалоговые окна, а также возвращает ввод пользователя. Это позволяет предоставлять пользователю информацию, запрашивать у него информацию при помощи любых скриптов Bash. Вот пример графического клиента для сервиса whois для определенного домена.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 # Get domain name&lt;br /&gt;
 _zenity=&amp;quot;/usr/bin/zenity&amp;quot;&lt;br /&gt;
 _out=&amp;quot;/tmp/whois.output.$$&amp;quot;&lt;br /&gt;
 domain=$(${_zenity} --title  &amp;quot;Enter domain&amp;quot; \&lt;br /&gt;
 	            --entry --text &amp;quot;Enter the domain you would like to see whois info&amp;quot; )&lt;br /&gt;
 &lt;br /&gt;
 if [ $? -eq 0 ]&lt;br /&gt;
 then&lt;br /&gt;
  # Display a progress dialog while searching whois database&lt;br /&gt;
  whois $domain  | tee &amp;gt;(${_zenity} --width=200 --height=100 \&lt;br /&gt;
  				    --title=&amp;quot;whois&amp;quot; --progress \&lt;br /&gt;
			            --pulsate --text=&amp;quot;Searching domain info...&amp;quot; \&lt;br /&gt;
                                    --auto-kill --auto-close \&lt;br /&gt;
                                    --percentage=10) &amp;gt;${_out}&lt;br /&gt;
 &lt;br /&gt;
  # Display back output&lt;br /&gt;
  ${_zenity} --width=800 --height=600  \&lt;br /&gt;
	     --title &amp;quot;Whois info for $domain&amp;quot; \&lt;br /&gt;
	     --text-info --filename=&amp;quot;${_out}&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
   ${_zenity} --error \&lt;br /&gt;
	     --text=&amp;quot;No input provided&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Индикатор для wget:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    DFile=&amp;quot;http://$RemoteHost/install&amp;quot;&lt;br /&gt;
    set -o pipefail&lt;br /&gt;
    (wget -O /home/nameless/install $DFile 2&amp;gt;&amp;amp;1 |sed -u 's/^ *[0-9]*K[ .]*\([0-9]*%\).*/\1/')|\&lt;br /&gt;
        zenity --title=&amp;quot;$MSG_DOWNLOAD_TITLE&amp;quot; \&lt;br /&gt;
            --text=&amp;quot;$MSG_DOWNLOAD_TEXT&amp;quot; \&lt;br /&gt;
            --progress --auto-close --auto-kill \&lt;br /&gt;
            --width=500 \&lt;br /&gt;
            &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
    [ $? -ne 0 ] &amp;amp;&amp;amp; NetworkError&lt;br /&gt;
    chmod +x ~nameless/install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Дополнительная информация по команде zenity:&lt;br /&gt;
 zenity --help&lt;br /&gt;
 man zenity&lt;br /&gt;
&lt;br /&gt;
'''Команда Dialog'''&lt;br /&gt;
&lt;br /&gt;
Dialog ≈ это приложение, которое включается в скрипты Bash и создает виджеты в текстовом интерфейсе. Использует библиотеки curses или ncurses. Вот пример кода:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
dialog --title &amp;quot;Delete file&amp;quot; \&lt;br /&gt;
--backtitle &amp;quot;Linux Shell Script Tutorial Example&amp;quot; \&lt;br /&gt;
--yesno &amp;quot;Are you sure you want to permanently delete \&amp;quot;/tmp/foo.txt\&amp;quot;?&amp;quot; 7 60&lt;br /&gt;
 &lt;br /&gt;
# Get exit status&lt;br /&gt;
# 0 means user hit [yes] button.&lt;br /&gt;
# 1 means user hit [no] button.&lt;br /&gt;
# 255 means user hit [Esc] key.&lt;br /&gt;
response=$?&lt;br /&gt;
case $response in&lt;br /&gt;
   0) echo &amp;quot;File deleted.&amp;quot;;;&lt;br /&gt;
   1) echo &amp;quot;File not deleted.&amp;quot;;;&lt;br /&gt;
   255) echo &amp;quot;[ESC] key pressed.&amp;quot;;;&lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Основы'''&lt;br /&gt;
&lt;br /&gt;
Вот первый скрипт, работу которого я проверил. Он просто выводит диалог с кнопками &amp;quot;Да&amp;quot; и &amp;quot;Нет&amp;quot;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
DIALOG=${DIALOG=dialog}&lt;br /&gt;
$DIALOG --title &amp;quot; Мой первый диалог&amp;quot; --clear \&lt;br /&gt;
        --yesno &amp;quot;Привет! Перед вами пример программы,\nиспользующей (X)dialog&amp;quot; 10 40&lt;br /&gt;
case $? in&lt;br /&gt;
    0)&lt;br /&gt;
        echo &amp;quot;Выбрано 'Да'.&amp;quot;;;&lt;br /&gt;
    1)&lt;br /&gt;
        echo &amp;quot;Выбрано 'Нет'.&amp;quot;;;&lt;br /&gt;
    255)&lt;br /&gt;
        echo &amp;quot;Нажата клавиша ESC.&amp;quot;;;&lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Ввод данных'''&lt;br /&gt;
&lt;br /&gt;
Следующая программа ожидает ввода строку и затем отображает её на экране.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
DIALOG=${DIALOG=dialog}&lt;br /&gt;
tempfile=`tempfile 2&amp;gt;/dev/null` || tempfile=/tmp/test$$&lt;br /&gt;
trap &amp;quot;rm -f $tempfile&amp;quot; 0 1 2 5 15&lt;br /&gt;
$DIALOG --title &amp;quot;Ввод данных&amp;quot; --clear \&lt;br /&gt;
        --inputbox &amp;quot;Привет! Перед вами пример ввода даных\nВведите своё имя:&amp;quot; 16 51 2&amp;gt; $tempfile&lt;br /&gt;
retval=$?&lt;br /&gt;
case $retval in&lt;br /&gt;
  0)&lt;br /&gt;
    echo &amp;quot;Вы ввели `cat $tempfile`&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
  1)&lt;br /&gt;
    echo &amp;quot;Отказ от ввода.&amp;quot;;;&lt;br /&gt;
  255)&lt;br /&gt;
    if test -s $tempfile ; then&lt;br /&gt;
      cat $tempfile&lt;br /&gt;
    else&lt;br /&gt;
      echo &amp;quot;Нажата клавиша ESC.&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    ;;&lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Организация меню'''&lt;br /&gt;
&lt;br /&gt;
Следующая программа позволяет вам организовать список с возможностью выбора одного из элементов:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
DIALOG=${DIALOG=dialog}&lt;br /&gt;
tempfile=`mktemp 2&amp;gt;/dev/null` || tempfile=/tmp/test$$&lt;br /&gt;
trap &amp;quot;rm -f $tempfile&amp;quot; 0 1 2 5 15&lt;br /&gt;
$DIALOG --clear --title &amp;quot;Мои любимые исполнители&amp;quot; \&lt;br /&gt;
        --menu &amp;quot;Все любят песни хинди, поэтому выбирайте:&amp;quot; 20 51 4 \&lt;br /&gt;
        &amp;quot;Rafi&amp;quot;  &amp;quot;Mohammed Rafi&amp;quot; \&lt;br /&gt;
        &amp;quot;Mukesh&amp;quot; &amp;quot;Mukesh&amp;quot; \&lt;br /&gt;
        &amp;quot;Kishore&amp;quot; &amp;quot;Kishore Kumar&amp;quot; \&lt;br /&gt;
        &amp;quot;Saigal&amp;quot; &amp;quot;K L Saigal&amp;quot; \&lt;br /&gt;
        &amp;quot;Lata&amp;quot;  &amp;quot;Lata Mangeshkar&amp;quot; \&lt;br /&gt;
        &amp;quot;Yesudas&amp;quot;  &amp;quot;K J Yesudas&amp;quot; 2&amp;gt; $tempfile&lt;br /&gt;
retval=$?&lt;br /&gt;
choice=`cat $tempfile`&lt;br /&gt;
case $retval in&lt;br /&gt;
  0)&lt;br /&gt;
    echo &amp;quot;Да вы эстет! '$choice' -- это лучшее, что вы слышали в своей жизни!&amp;quot;;;&lt;br /&gt;
  1)&lt;br /&gt;
    echo &amp;quot;Отказ от ввода.&amp;quot;;;&lt;br /&gt;
  255)&lt;br /&gt;
    echo &amp;quot;Нажата клавиша ESC.&amp;quot;;;&lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Списки зависимых кнопок (radiolist) и флажков (checklist).'''&lt;br /&gt;
&lt;br /&gt;
Формирование таких списков аналогично организации меню, описанного в предыдущем разделе.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#! /bin/sh&lt;br /&gt;
DIALOG=${DIALOG=dialog}&lt;br /&gt;
tempfile=`mktemp 2&amp;gt;/dev/null` || tempfile=/tmp/test$$&lt;br /&gt;
trap &amp;quot;rm -f $tempfile&amp;quot; 0 1 2 5 15&lt;br /&gt;
$DIALOG --backtitle &amp;quot;Не стесняйтесь, выберите любимого певца&amp;quot; \&lt;br /&gt;
        --title &amp;quot;Выбор исполнителя&amp;quot; --clear \&lt;br /&gt;
        --radiolist &amp;quot;Мой любимый певец, это... &amp;quot; 20 61 5 \&lt;br /&gt;
        &amp;quot;Rafi&amp;quot;  &amp;quot;Mohammed Rafi&amp;quot; off \&lt;br /&gt;
        &amp;quot;Lata&amp;quot;    &amp;quot;Lata Mangeshkar&amp;quot; ON \&lt;br /&gt;
        &amp;quot;Hemant&amp;quot; &amp;quot;Hemant Kumar&amp;quot; off \&lt;br /&gt;
        &amp;quot;Dey&amp;quot;    &amp;quot;MannaDey&amp;quot; off \&lt;br /&gt;
        &amp;quot;Kishore&amp;quot;    &amp;quot;Kishore Kumar&amp;quot; off \&lt;br /&gt;
        &amp;quot;Yesudas&amp;quot;   &amp;quot;K. J. Yesudas&amp;quot; off  2&amp;gt; $tempfile&lt;br /&gt;
retval=$?&lt;br /&gt;
choice=`cat $tempfile`&lt;br /&gt;
case $retval in&lt;br /&gt;
  0)&lt;br /&gt;
    echo &amp;quot;Ого! Кто бы мог подумать, но выбор пал на '$choice'&amp;quot;;;&lt;br /&gt;
  1)&lt;br /&gt;
    echo &amp;quot;Отказ от ввода.&amp;quot;;;&lt;br /&gt;
  255)&lt;br /&gt;
    echo &amp;quot;Нажата клавиша ESC.&amp;quot;;;&lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Создание индикатора'''&lt;br /&gt;
&lt;br /&gt;
Такой элемент позволяет визуализировать процесс выполнения вашего скрипта:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
DIALOG=${DIALOG=dialog}&lt;br /&gt;
COUNT=10&lt;br /&gt;
(&lt;br /&gt;
while test $COUNT != 110&lt;br /&gt;
do&lt;br /&gt;
echo $COUNT&lt;br /&gt;
echo &amp;quot;XXX&amp;quot;&lt;br /&gt;
echo &amp;quot;Новое сообщение ($COUNT процентов)&amp;quot;&lt;br /&gt;
echo &amp;quot;Строка 2&amp;quot;&lt;br /&gt;
echo &amp;quot;XXX&amp;quot;&lt;br /&gt;
COUNT=`expr $COUNT + 10`&lt;br /&gt;
sleep 1&lt;br /&gt;
done&lt;br /&gt;
) |&lt;br /&gt;
$DIALOG --title &amp;quot;Индикатор&amp;quot; --gauge &amp;quot;А вот пример простейшего индикатора&amp;quot; 20 70 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Особенность реализации индикатора заключается в том, что программа&lt;br /&gt;
dialog получает данные через конвейер от кода, который заключён внутри&lt;br /&gt;
круглых скобок. Есть два момента, на которые необходимо обратить&lt;br /&gt;
внимание. Первый -- это обязательное использование переменной $COUNT.&lt;br /&gt;
Именно из неё dialog/Xdialog считывает текущее значение индикатора.&lt;br /&gt;
При этом желательно, чтобы значение переменной колебалось в диапазоне&lt;br /&gt;
от 0 до 100. Второй -- это использование строк вида &amp;quot;XXX&amp;quot; в качестве&lt;br /&gt;
ограничителей сообщения, выводящегося на экран.&lt;br /&gt;
&lt;br /&gt;
(В реализации этого элемента есть ошибка. Если используется dialog, то&lt;br /&gt;
всё отрабатывается корректно, а в случае с Xdialog строка &amp;quot;Строка 2&amp;quot;&lt;br /&gt;
не переносится на новую строку. Использьзование тоже \n не помогает.)&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>