Pour intercepter les notifications (notify-osd
) sous Linux (Ubuntu), j'utilise le script dbus-monitor
ci-dessous. Par la suite, le script exécute un autre script (/opt/nonotifs/nonotifs/silent
) avec la notification interceptée en argument, pour traitement ultérieur:
#!/bin/bash
dbus-monitor "interface='org.freedesktop.Notifications'" | \
grep --line-buffered "string" | \
grep --line-buffered -e method -e ":" -e '""' -e urgency -e notify -v | \
grep --line-buffered '.*(?=string)|(?<=string).*' -oPi | \
grep --line-buffered -v '^\s*$' | \
xargs -I '{}' /opt/nonotifs/nonotifs/silent {}
Cela fonctionne parfaitement, sauf avec notifications par hplip
.
Lorsqu'il est exécuté depuis un terminal, le script ci-dessus montre:
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
Lorsque vous utilisez l'option -0
, le script ne fournit aucun argument.
Dans certains cas, le script s'interrompt ensuite. Si cela devait toujours , il pourrait être contourné en le lançant dans un wrapper "Keep Alive", que j'ai essayé. Souvent cependant, le script ne se termine pas, mais il arrête néanmoins de renvoyer les notifications interceptées.
Comment puis-je résoudre ça?
Comme suggéré par @Serg, j'ai remplacé la section xargs...
par cat -A
, pour voir ce qui est passé à xargs
. Cela montre qu’il existe effectivement un guillemet double sans correspondance dans la notification de hplip
(la troisième ligne), ce qui semble être un bogue dans la notification.
La sortie lors de l'exécution avec cat -A
, en appelant la notification:
"hplip"$
"HPLIP Device Status"$
"Officejet_Pro_8600$
"transient"$
De man xargs
:
--delimiter = delim - d delim Les éléments en entrée sont terminés par le caractère spécifié. Les guillemets Et les barres obliques inverses ne sont pas spéciales; chaque caractère de l'entrée est Pris littéralement. Désactive la chaîne de fin de fichier, qui est traitée comme tout autre argument. Cela peut être utilisé lorsque l'entrée Consiste simplement en éléments séparés par une ligne, bien qu'il soit presque toujours préférable de concevoir votre programme de manière à utiliser --null où Est possible. Le délimiteur spécifié peut être un seul caractère , Un caractère d'échappement de style C tel que\n, ou un code d'échappement octal ou Hexadécimal. Les codes d'échappement octaux et hexadécimaux désignent comme pour la commande printf. Les caractères multi-octets ne sont Pas pris en charge.
Par exemple:
$ echo '"""' | xargs
\xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
$ echo '"""' | xargs -d '\n'
"""
$ echo '"""' | xargs -d ' '
"""
Bien sûr, utiliser l’un ou l’autre pourrait casser des choses, mais peut-être pas autant que -0
.