22.06.09 23:42 assaron

Tips & tricksУведомление о завершении задачи в zsh

Иногда в терминале выполняются какие-то долгие задачи (обновление, компиляция и т.д.). Очень лениво время от времени переключаться на них, чтоб проверить не закончились ли они. К счастью можно предоставить возможность системе уведомить пользователя об окончании работы команды.

Для этого нам понадобится zsh, «хороший» эмулятор терминала и оконный менеджер, поддерживающий уведомления об активности в окне (появлении visible hint bit в свойстве WM_HINTS окна).

От эмулятора терминала требуется, чтоб он при выводе символа \a выставлял нужный свойство. В случае urxvt это делается выставлением urxvt.urgentOnBell в true. Например таким образом:

$ echo "urxvt.urgentOnBell: true" >> ~/.Xdefaults; xrdb ~/.Xdefaults

Теперь если в новом терминале выполнить $ sleep 1; echo -e '\a' и переключить окно, то что-нибудь случится :) Например в KDE, должна начать мигать кнопка на панели задач (надеюсь кто-нибудь понял, что я имел в виду этой фразой). Если ничего не произошло, то это плохо, и надо разбираться с конкретным WM.

Теперь хотелось бы в .zshrc объявить функцию postexec() { echo -ne '\a' }, которая бы выполнялась после окончания работы команды, обрадоваться. Но к сожалению такой функции нет, зато есть функция precmd, которая выполняется перед каждой командой.
После добавления в .zshrc строчки:

precmd() { echo -ne '\a' }

Если эта функция уже объявлена, то нужно просто добавить echo -ne '\a' в начало.

Ну и все, сохраняем изменения, запускаем новый терминал и проверяем выполнением sleep 1 и переключением на другое окно.



lwilis 23.06.09 00:11 # +0
Сначала подумал, что не понял соль. А потом понял, что все правильно понял (
Нет - это костыль.
Предвижу возражения из серии "это только для объемных задач" - и все-равно. О том, что нужна доп команда скорее всего вспомнишь уже после начала сборки, рендеринга или чего еще.
assaron 23.06.09 00:17 # +0
В том то и радость, что дополнительная команда не нужна. Функция precmd() вызывается z-shell'ом автоматически.
ZaWertun 23.06.09 00:54 # +0
по-идее можно реализовать и на bash, если записать строку с echo в тело функции
prompt_command
assaron 23.06.09 00:55 # +0
возможно
lwilis 23.06.09 01:28 # +0
для тех, кто еще не перешел на zsh можно было б и упомянуть этот факт явно.
в общем, плюсанул
masai 23.06.09 01:07 # +0
Здорово!

Аналогично можно в precmd() использовать, например, notify-send, чтоб всплывающее окошко появилось.
Посты Комментарии
Последние посты
Посты Комментарии
Последние комментарии
Посты Комментарии
Изменения
Посты Комментарии Изменения Черновики Избранное
Черновики (все)
Посты Комментарии Изменения Черновики Избранное
Избранное (всё)
Посты Комментарии Изменения Черновики Избранное
Лучшие блоги (все 127)
Элита (все 2421 из 196 городов)
welinux.ru