web-dev-qa-db-fra.com

Comment puis-je résoudre l'erreur "inégalée des guillemets" en utilisant dbus-monitor en combinaison avec xargs?

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.

enter image description here

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.

Ce que j'ai essayé

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?

Modifier

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"$
7
Jacob Vlijm

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.

3
muru