Делаем функциональные уведомления на рабочем столе Linux: кнопки, иконки, ссылки
Приветствую!

Сегодня покажу, как создавать кастомные функциональные уведомления на рабочем столе с помощью консольной утилиты notify-send. Такие уведомления поддерживают активные кнопки, умеют отображать иконки и кликабельные веб ссылки. В качестве примера настроим напоминалку с помощью скриптика на Bash и планировщика Cron для запуска уведомлений по расписанию. Будет интересно)

Предварительные требования

Для реализации нашей задачи необходима утилита notify-send версии 0.8+, т.к. начиная с этой версии она поддерживает активные кнопки. Проверить версию можно такой командой:

BASH
notify-send --version
Нажмите, чтобы развернуть и увидеть больше

Версия nptify-send

Данная утилита является частью пакета libnotify-bin, который зависит от библиотеки уведомлений — libnotify4. Соответственно версия у этих пакетов также должна быть 0.8 или выше.

Проверить версию этих пакетов можно такой командой:

BASH
apt show libnotify4 libnotify-bin | grep Version
Нажмите, чтобы развернуть и увидеть больше

Команда apt show показывает подробную информацию о пакете.

Версия библиотек

Если версия пакетов libnotify-bin и libnotify4 в вашей системе меньше 0.8 (а в Linux Mint 21.3 и Ubuntu 22.04.03 как раз версия 0.7.9):

то их необходимо обновить вручную. Инструкция, как это сделать на примере Linux Mint под спойлером.

Примечательно, что в Linux Mint, основанной на Debian 12 (LMDE), версия libnotify4 в стандартных репозиториях находится версия 0.8.1.

В репозиториях промежуточного дистрибутива Ubuntu версии 23.10 есть совместимые пакеты нужной версии. Идём на страницу загрузки, скачиваем и устанавливаем.

Кликните, для просмотра инструкции по обновлению пакетов libnotify4 и libnotify-bin до версии 0.8.2 в Linux Mint 21.

Качаем пакет libnotify4: https://packages.ubuntu.com/ru/mantic/amd64/libnotify4/download

При попытке установки, система уведомит нас, что из репозиториев уже установлена более старая версия:

Установка libnotify4

Нажимаем закрыть и далее «Установить пакет»:

Установка libnotify4

Теперь качаем libnotify-bin на странице: https://packages.ubuntu.com/ru/mantic/amd64/libnotify-bin/download

Установка аналогичная:

Установка libnotify-bin

Если всё встало корректно, проверяем версию:

BASH
apt show libnotify4 libnotify-bin | grep Version

notify-send --version
Нажмите, чтобы развернуть и увидеть больше

Проверка версий пакетов

Отлично. Теперь можем приступать к настройке кастомных уведомлений.

Пример вывода сообщений с помощью команды notify-send

Синтаксис команды notify-send имеет следующий вид:

BASH
notify-send [параметры] <заголовок_уведомлений> [тело_сообщения]
Нажмите, чтобы развернуть и увидеть больше

Помните, что в квадратных скобках указаны необязательные параметры)

Пробуем отправить простое текстовое уведомление:

BASH
notify-send 'Тестовое сообщение' 'Hello R4ven'
Нажмите, чтобы развернуть и увидеть больше

Тестовое уведомление

С помощью параметра --action можно создать кнопку, одну или несколько, при нажатии которой процессу возвращается ответ в стандартный вывод stdout. Такой подход позволяет гибко обрабатывать действия на нажатие кнопок уведомлений в скриптах и командах. Пример реализации будет ниже.

Про стандартные потоки данных в Linux я рассказывал в отдельной статье: Командная строка Linux, вывод и чтение содержимого: команды echo, cat, less.

Давайте попробуем вывести уведомление с активной кнопкой:

BASH
notify-send 'Тестовое сообщение' 'Hello R4ven' --action 'pressed=Тык на кнопку'
Нажмите, чтобы развернуть и увидеть больше

Уведомление с активной кнопкой

В команде выше мы для параметра --action указали ключ pressed, который необходимо возвратить оболочке при нажатии на кнопку. Т.е. при нажатии на кнопку, в консоли будет выведено слово pressed. Если такой ключ не задать, то по умолчанию возвращается нулевой код завершения.

Теперь попробуем вывести уведомление с несколькими кнопками:

BASH
notify-send 'Тестовое сообщение' 'Hello R4ven' --action 'pressed=Тык на кнопку' --action 'pressed=Не нажимай на меня'
Нажмите, чтобы развернуть и увидеть больше

Уведомление с несколькими кнопками

Ключи для кнопок можно задавать произвольные.

Выведем уведомление с системными иконками, добавив параметр -i и название иконки:

BASH
notify-send  -i 'face-devilish' 'Тестовое сообщение' 'Hello R4ven' --action 'pressed=Тык на кнопку'
Нажмите, чтобы развернуть и увидеть больше

Где face-devilish — название иконки.

Уведомление с иконкой

Чтобы узнать названия иконок в системе, можно воспользоваться графической утилитой gtk3-icon-browser. Она идёт в составе пакета gtk-3-examples из стандартных репозиториев. Для его установки выполните:

BASH
sudo apt install gtk-3-examples
Нажмите, чтобы развернуть и увидеть больше

После установки выполните в консоли:

BASH
gtk3-icon-browser
Нажмите, чтобы развернуть и увидеть больше

Просмотр иконок в gtk3-icon-browser

Ну и пример уведомление с кликабельной веб ссылкой:

BASH
notify-send  -i 'face-devilish' 'Тестовое сообщение' 'https://r4ven.me - вороний блог' --action 'pressed=Тык на кнопку'
Нажмите, чтобы развернуть и увидеть больше

Уведомление с веб ссылкой

Теперь давайте настроим напоминалку в виде уведомления, в котором будет сообщение, что нужно отлипнуть от экрана монитора и выполнить гимнастику для глаз по видео на YouTube.

Пишем bash скрипт для удобства

Открываем новый файл на редактирование:

BASH
nvim ~/.local/bin/notify.sh
Нажмите, чтобы развернуть и увидеть больше

И наполняем его таким кодом:

BASH
#!/usr/bin/env bash

# задаём переменные
notify_title="Выполни гимнастику для глаз"
notify_messasges="Смотри видео 1 или 2"
notify_icon="face-devilish"
notify_button1="Видео на 1 мин."
notify_button2="Видео на 5 мин."
pressed_button="$(notify-send "$notify_title" "$notify_messasges" -i "$notify_icon" --action "video1=$notify_button1" --action "video2=$notify_button2")"

# составляем условное выражение для обработки нажатий на кнопки
if [[ "$pressed_button" == "video1" ]]; then
    firefox --new-window https://youtu.be/4ZHVYQX7tx0
elif [[ "$pressed_button" == "video2" ]]; then
    firefox --new-window https://youtu.be/SAU-Smg3tfg
fi
Нажмите, чтобы развернуть и увидеть больше

Скрипт на bash

Скрипт также доступен в репе на GitHub.

В данном скриптике мы сначала определяем переменные, содержимое которых мы будем выводить в уведомлении. Затем задаём отдельную переменную, которая, с помощью механизма подстановки будет содержать результат выполнения команды с notify-send. После чего, с помощью условных выражений обрабатываем полученный вывод. В данном примере — открывается новое окно firefox с выбранной, в зависимости от нажатой кнопки, ссылкой на видео с упражнениями для глаз. Видео я взял из тырнета.

Если вы настраивали Neovim по , то помните, что при нажатии F5 происходит сохранение файла и, если он является скриптом, то его выполнение во всплывающем окне редактора:

Проверка работы скрипта

Для выхода либо нажмите на уведомление, либо Ctrl+c в окне редактора. Как видно, скрипт исполняется)

Если Neovim вы не настраивали, то просто сохраняем файл и выходим. Затем делаем наш скрипт исполняемым такой командой:

BASH
chmod +x ~/.local/bin/notify.sh
Нажмите, чтобы развернуть и увидеть больше

chmod — это команда управления правами на файлы в Linux, а +x это параметр добавления флага исполнения для указанного файла. В скором будущем будет отдельный пост по , как раз поговорим про права.

Проверим результат команды выше:

BASH
ls -l ~/.local/bin/notify.sh
Нажмите, чтобы развернуть и увидеть больше

Просмотр инфо о скрипте

Отлично. Теперь, чтобы выполнить скрипт, просто указываем путь до него в терминале. При наличии флага исполнения (x), командная оболочка сама поймёт, чтобы вы запускаете исполняемый файл. Вводим в терминале:

BASH
~/.local/bin/notify.sh
Нажмите, чтобы развернуть и увидеть больше

Запуск скрипта

Все работает. Теперь давайте создадим задание, которое будет запускать данный скрипт каждые 3 часа.

Добавляем задание в планировщик Cron

В системах на базе Linux из коробки поставляется стандартный планировщик заданий — Cron. Он довольно прост в использовании, стоит только разобраться в синтаксисе расписаний выполнения.

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

BASH
crontab -e
Нажмите, чтобы развернуть и увидеть больше

Если вы выполняете эту команду впервые, вам предложат выбрать консольный текстовый редактор, для редактирования заданий cron. Разумеется мы выбираем Neovim)

В моём случае выбираю 2-й пункт и нажимаю Enter:

Выбор редактора

По умолчанию, файл crontab уже хорошо прокомментирован: объясняется синтаксис и приведен пример задачи.

Окно планировщика cron

Первые 5 параметров, разделенные пробелом, являются значениями расписания:

Значения по умолчанию — это символы * * * * *, которые обозначают «каждый раз», т.е. каждую минуту, каждый час ну и т.д.

Более подробное описание + возможность протестировать синтаксис можно на полезном ресурсе: https://crontab.guru (EN).

После открытия crontab, добавляем в конец файла такую строку:

BASH
*/2 * * * * DISPLAY=":0.0" XDG_RUNTIME_DIR="/run/user/$(id -u)" ~/.local/bin/notify.sh
Нажмите, чтобы развернуть и увидеть больше

Состав строки:

Переменные DISPLAY и XDG_RUNTIME_DIR необходимы, чтобы cron понимал, в какой среде необходимо выводить уведомления. Если их не указать, то скрипт будет выполниться, но в фоновом режиме и уведомлений мы не увидим.

Сохраняем и закрываем редактор.

Теперь, каждые 2 минуты на рабочем столе должно появляться наше настроенное уведомление:

Проверка cron

Чтобы посмотреть список установленных задач в crontab выполните команду:

BASH
crontab -l
Нажмите, чтобы развернуть и увидеть больше

Вывод задач планировщика

После того как убедимся, что запланированное задание работает, отредактируем время его появления — установим на каждые 3 часа. Для этого скорректируйте строку задачи (в 0 минут каждого 3-го часа):

BASH
0 */3 * * * DISPLAY=":0.0" XDG_RUNTIME_DIR="/run/user/$(id -u)" ~/.local/bin/notify.sh
Нажмите, чтобы развернуть и увидеть больше

Заключение

Вот мы с вами немного узнали про уведомления на рабочем столе Linux: научились отправлять их в ручную из терминала с помощью команды notify-send, написали небольшой Bash скрипт для удобства и добавили его запуск в системный планировщик заданий — Cron.

В будущем обязательно сделаю отдельную статью про детальную настройку планировщика Cron и его возможности. А пока, спасибо, что читаете) Подписывайтесь на наш телеграм канал @r4ven_me и добавляйтесь в чат @r4ven_me_chat, если у вас появились вопросы или просто желание обсудить интересные темы из мира IT.

Успехов!

Полезные источники

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/automation/delaem-funkcionalnye-uvedomleniya-na-rabochem-stole-linux-knopki-ikonki-ssylki/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша