Простые графические 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="Произошла ошибка при выполнении скрипта."
Команда откроет окно с сообщением. Поместите такую строку в нужное место скрипта и пользователь увидит графическое сообщение об ошибке. Можно передавать переменные для уточнения причины ошибки.
Пример вопроса Да/Нет:
if zenity --question --title="Подтверждение" --text="Запустить скрипт?"; then
echo "Пользователь подтвердил"
else
echo "Пользователь отменил"
fi
Zenity возвращает код завершения: 0 при подтверждении/успехе, ненулевой код при отмене или ошибке. Учитывайте это, чтобы управлять потоком в скрипте.
Текстовое поле ввода:
FAV=$(zenity --entry --title="Любимый сайт" --text="Какой ваш любимый сайт?")
Вы можете сохранить ввод в переменную и затем использовать её в скрипте.
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 (
$?) для обработки отмены пользователем. - Для больших фрагментов текста применяйте 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
- Определите сценарии взаимодействия: какие вопросы задать, какие действия выполнить.
- Прототипируйте диалоги из терминала.
- Соберите логику в скрипт, обрабатывайте коды возврата и пустые значения.
- Добавьте обработку ошибок и удобные сообщения для пользователя.
- Проверьте скрипт на разных окружениях и версиях 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, затем расширяйте функциональность, добавляя логику и интеграцию с системными задачами.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента