Почему не работает dzen2 при вызове через?

dzen2 – полезная утилита уведомлений. Эта команда выведет на экран сообщение с надписью «Привет»:

echo Hi | dzen2 -p 

Debian's – это утилита, которая планирует события в будущем. Эта команда заставит файл «foo» появиться в вашем пользовательском каталоге через 1 минуту:

 echo "touch ~/foo" | at now + 1 minute 

Так почему же эта команда не вызывает уведомление dzen2 через 1 минуту?

 echo "echo Hi | dzen2 -p" | at now + 1 minute 

Я расследовал часами и не могу найти причины, почему это не работает! У меня есть догадка, что это связано с оболочкой, на которую вызывается, но я просто не понимаю, почему она терпит неудачу. В качестве примера встречной точки эта команда работает очень хорошо:

 echo "notify-send Hi" | at now + 1 minute 

Программа, которая составляет задание, является дочерним элементом процесса atd (в daemon ), а не оболочки, в которой вы работаете. Таким образом, он не наследует текущую среду оболочки. Система at системе организует копирование среды (и рабочего каталога и еще нескольких неясных вещей), но она не содержит нескольких переменных.

В частности, переменная DISPLAY не копируется в задание. Эта переменная сообщает всем X-программам, которые отображаются для подключения. Без дисплея X dzen2 не знает, где вывести уведомление. При удалении DISPLAY поскольку он обычно используется для пакетных заданий, которые не производят никакого вывода терминала или графического вывода.

notify-send работает, потому что он не подключается к X-серверу: он использует D-bus для подключения к демону, который подключен к вашей X-сессии.

Вы можете сделать работу dzen2, явно скопировав переменную DISPLAY :

 echo "export DISPLAY=$DISPLAY;" 'echo hello | dzen2 -p' | at now + 42 minutes 

Вероятно, dzen2 создает сообщение об ошибке (стандартное сообщение не Can't open display: :). Любое сообщение о выходе или ошибке, созданное на задании, отправляется локальной почтой (точно так же, как и для заданий cron). Проверьте местную почту.