Pourquoi dzen2 ne fonctionne-t-il pas lorsqu'il est appelé via?

dzen2 est un utilitaire de notification de toutes sortes. Cette command fera une notification qui dit "Hi" apparaîtra sur l'écran:

echo Hi | dzen2 -p 

Debian's est un utilitaire qui programme les events à venir dans le futur. Cette command fera apparaître le file "foo" dans votre directory user après 1 minute:

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

Alors, pourquoi cette command n'entraîne-t-elle pas l' dzen2 une notification dzen2 après 1 minute?

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

J'ai enquêté pendant des heures et n'arrive pas à find une raison pour laquelle cela ne fonctionne pas! J'ai l'intuition que cela a à voir avec la coquille invoquée par, mais je ne comprends pas pourquoi elle échoue. Comme exemple de contrepoint, cette command fonctionne très bien:

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

Le programme qui constitue le travail at est un enfant du atd (at daemon ), pas du shell où vous courez. Il n'hérite donc pas de l'environnement actuel du shell. Le système at se charge de copyr l'environnement (et le directory de travail et quelque chose de plus obscur), mais il omet quelques variables.

En particulier, la variable DISPLAY n'est pas copiée dans le travail at. Cette variable indique à tous les programmes X qui s'affichent à se connecter. Sans affichage X, dzen2 ne sait pas où faire apparaître une notification. Supprime DISPLAY car il est généralement utilisé pour les tâches par lots, qui ne produisent aucun terminal ni aucune sortie graphique.

notify-send fonctionne car il ne se connecte pas au server X: il utilise D-bus pour se connecter à un démon attaché à votre session X.

Vous pouvez faire fonctionner dzen2 en copiant explicitement la variable DISPLAY :

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

Il est probable que dzen2 génère un message d'erreur (le message standard est Can't open display: :). Toute sortie ou message d'erreur produit par le travail at est envoyé par courrier local (exactement comme pour les tâches cron). Vérifiez votre courrier local.