Гид по технологиям

Простые графические shell-скрипты с Zenity на Linux

• 5 min read • Linux • Обновлено 23 Nov 2025
Zenity: графические shell-скрипты на Linux
Zenity: графические shell-скрипты на Linux

Как создавать простые графические shell-скрипты с Zenity на Linux

Быстрые ссылки

  • Установка Zenity
  • Использование Zenity
  • Пример скрипта
  • Подсказки, отладка и шаблоны

Zenity добавляет графические интерфейсы к shell-скриптам одной командой. Shell-скрипты удобны для автоматизации повседневных задач, но обычно они работают в терминале — Zenity выводит их на рабочий стол и делает взаимодействие с пользователем более дружелюбным.

Краткое определение: Zenity — это утилита, которая показывает GTK-диалоги и возвращает результат в shell-скрипт.

Установка Zenity

Zenity обычно присутствует в репозиториях большинства дистрибутивов. Для Debian/Ubuntu и их производных выполните:

sudo apt-get install zenity

Для Fedora:

sudo dnf install zenity

Для Arch Linux:

sudo pacman -S zenity

Важно: на десктопах GNOME Zenity часто уже установлен. Если вы используете KDE, рассмотрите kdialog как нативную альтернативу.

Основы использования Zenity

Вы можете экспериментировать с Zenity прямо из терминала. Пример диалога ошибки:

zenity --error --title="Ошибка" --text="Произошла ошибка при выполнении скрипта."

Диалог ошибки Zenity

Команда откроет окно с сообщением. Поместите такую строку в нужное место скрипта и пользователь увидит графическое сообщение об ошибке. Можно передавать переменные для уточнения причины ошибки.

Пример вопроса Да/Нет:

if zenity --question --title="Подтверждение" --text="Запустить скрипт?"; then
  echo "Пользователь подтвердил"
else
  echo "Пользователь отменил"
fi

Диалог подтверждения Zenity

Zenity возвращает код завершения: 0 при подтверждении/успехе, ненулевой код при отмене или ошибке. Учитывайте это, чтобы управлять потоком в скрипте.

Текстовое поле ввода:

FAV=$(zenity --entry --title="Любимый сайт" --text="Какой ваш любимый сайт?")

Диалог ввода текста Zenity

Вы можете сохранить ввод в переменную и затем использовать её в скрипте.

Zenity также поддерживает выбор файлов, календарь, шкалы прогресса и другие диалоги. Для полного списка типов и опций смотрите man zenity или zenity --help.

Важно: некоторые параметры зависят от версии Zenity. Если поведение отличается, проверьте версию командой zenity --version.

Пример: графический таймер

Ниже — простой графический таймер, который спрашивает длительность, ожидает и показывает уведомление по окончании.

#!/bin/bash
# Скрипт спрашивает время, ждёт указанное количество и показывает уведомление.
TIME=$(zenity --entry --title="Таймер" --text="Введите длительность для таймера.\n\nИспользуйте 5s для 5 секунд, 10m для 10 минут или 2h для 2 часов.")

# Если пользователь отменил ввод, завершаем скрипт
if [ $? -ne 0 ] || [ -z "$TIME" ]; then
  zenity --info --title="Таймер" --text="Таймер не запущен."
  exit 1
fi

sleep $TIME
zenity --info --title="Таймер завершён" --text="Таймер завершён. Прошло $TIME."

Пример скрипта таймера

Обратите внимание на экранирование перевода строки как \n внутри строки, передаваемой Zenity. После сохранения файла не забудьте дать ему права на выполнение:

chmod +x timer.sh
./timer.sh

Запуск графического таймера Zenity

Полезные приёмы и подсказки

  • Используйте переменные для подстановки текста в диалоги и передачу данных между командами.
  • Проверяйте код возврата Zenity ($?) для обработки отмены пользователем.
  • Для больших фрагментов текста применяйте heredoc для сохранения читаемости:
TEXT=$(cat <
  • Для прогресс-диалогов можно отправлять строки в zenity через pipe и управлять прогрессом программно.

Шаблоны команд — набор примеров

  • Сообщение об ошибке:
zenity --error --title="Ошибка" --text="Невозможно сохранить файл. Проверьте права доступа."
  • Информационное сообщение:
zenity --info --title="Готово" --text="Операция завершена успешно."
  • Выбор файла:
FILE=$(zenity --file-selection --title="Выберите файл для обработки")
  • Прогресс бар (пример чтения из stdout):
{ for i in {1..100}; do echo $i; sleep 0.1; done } | zenity --progress --title="Выполнение" --percentage=0

Когда Zenity не подходит и альтернативы

  • Для сложных пользовательских интерфейсов с большим количеством элементов и динамикой лучше использовать полноценный GUI на Python (GTK/Qt) или Electron.
  • На KDE лучше применять kdialog — он интегрируется с окружением рабочего стола.
  • YAD (Yet Another Dialog) — расширенная альтернатива для тех, кому не хватает опций Zenity.

Мини-методология разработки GUI-скрипта с Zenity

  1. Определите сценарии взаимодействия: какие вопросы задать, какие действия выполнить.
  2. Прототипируйте диалоги из терминала.
  3. Соберите логику в скрипт, обрабатывайте коды возврата и пустые значения.
  4. Добавьте обработку ошибок и удобные сообщения для пользователя.
  5. Проверьте скрипт на разных окружениях и версиях Zenity.

Роли и чек-листы

Для разработчика:

  • Написать скрипт и протестировать ветви Yes/No.
  • Обработать коды возврата Zenity.
  • Убедиться, что все внешние команды доступны.

Для системного администратора:

  • Установить Zenity через менеджер пакетов.
  • Проверить зависимости GTK.
  • Развернуть скрипт в /usr/local/bin или создать .desktop для запуска.

Для конечного пользователя:

  • Проверить вводимые значения.
  • Иметь инструкции для отмены или повторного запуска.

Критерии приёмки

  • Скрипт корректно запускается двойным кликом или из терминала.
  • Диалоги отображаются без ошибок под целевым окружением рабочего стола.
  • Пользователь может отменить операцию, и это обрабатывается корректно.
  • При завершении задача даёт явное уведомление через Zenity.

Тесты и сценарии приёма

  • Ввод корректной длительности для таймера — по окончании выводится сообщение.
  • Нажатие Отмена на поле ввода — скрипт завершается без выполнения команды sleep.
  • Отсутствие Zenity — скрипт завершает работу с понятным сообщением в лог.

Иерархия решений — пример потока принятия решения

flowchart TD
  A[Запуск скрипта] --> B{Нужно ли взаимодействие с пользователем?}
  B -- Да --> C[Показать диалог Zenity]
  B -- Нет --> D[Запустить в фоне]
  C --> E{Пользователь подтвердил?}
  E -- Да --> F[Выполнить действие]
  E -- Нет --> G[Отменить и показать уведомление]
  F --> H[Завершение и уведомление]
  G --> H

Отладка и распространённые ошибки

  • Проблема: диалог не отображается при запуске из cron.
    Решение: cron не имеет доступа к сессии X/Wayland — для уведомлений из cron используйте инструменты, работающие с сессией пользователя, или создавайте .desktop задачу.

  • Проблема: zenity не найден.
    Решение: установить пакет zenity и убедиться, что PATH корректен.

Пример развертывания и интеграции

Вы можете создать .desktop файл, чтобы запускать скрипт как приложение в меню/панели:

[Примечание: пример .desktop прилагать не нужно, если вы не знакомы с форматом. Простой вариант — положить исполняемый файл в ~/bin и создать ярлык через окружение рабочего стола.]

Итоги и рекомендации

Zenity — быстрый способ сделать скрипты более дружелюбными для пользователей без усилий по разработке GUI. Для простых уведомлений, подтверждений и ввода он идеален. Для более сложных интерфейсов выбирайте полноценные GUI-инструменты или расширенные диалоги YAD/kdialog.

Краткий чек-лист на завершение:

  • Протестировать на целевой системе.
  • Обработать коды возврата и ошибки.
  • Рассмотреть создание .desktop ярлыка для удобства.

Завершение: начните с простых команд Zenity, затем расширяйте функциональность, добавляя логику и интеграцию с системными задачами.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро