Frage Wie kann ich "unmatched double quote" -Fehler mit dbus-monitor in Kombination mit xargs lösen?


Abfangen (notify-osd) Benachrichtigungen über Linux (Ubuntu), verwende ich die dbus-monitor Skript unten. Anschließend führt das Skript ein anderes Skript aus (/opt/nonotifs/nonotifs/silent) mit der abgefangenen Benachrichtigung als Argument, für die weitere Verarbeitung:

#!/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 {}

Das funktioniert einwandfrei, außer mit Benachrichtigungen von hplip.

enter image description here

Wenn es von einem Terminal ausgeführt wird, zeigt das obige Skript:

xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option

Bei Verwendung der Option -0 Das Skript liefert jedoch überhaupt kein Argument.

Was ich versucht habe

In einigen Fällen bricht das Skript anschließend ab. Wenn das wäre immer Es könnte der Fall sein, es könnte umhergearbeitet werden, indem man es in einem "keep alive" -Wrapper laufen lässt, den ich ausprobiert habe. Häufig wird das Skript jedoch nicht beendet, aber die abgefangenen Benachrichtigungen werden trotzdem nicht zurückgegeben.

Wie kann ich das lösen?

Bearbeiten

Wie von @Serg vorgeschlagen, ersetzte ich die xargs... Abschnitt nach cat -Aum zu sehen, was passiert ist xargs. Dies zeigt, dass es tatsächlich ein unübertroffenes Doppelzitat in der Mitteilung von hplip (die dritte Zeile), was ein Fehler in der Benachrichtigung zu sein scheint.

Die Ausgabe beim Ausführen mit cat -A, die Benachrichtigung aufrufen:

"hplip"$ 
"HPLIP Device Status"$ 
"Officejet_Pro_8600$ 
"transient"$

6
2017-10-28 20:06


Ursprung


Meine Vermutung wäre, dass das, was an Xargs weitergegeben wird, doppelte Anführungszeichen enthält. Versuchen Sie, das durch Ersetzen zu überprüfen cat -A Anstatt von xargs Dort - Sergiy Kolodyazhnyy
@Serg du hast vollkommen recht! Sei es, dass es ein Bug in der HP-Benachrichtigung zu sein scheint. Es gibt aus "hplip"$ "HPLIP Device Status"$ "Officejet_Pro_8600$ "transient"$, die tatsächlich ein unübertroffenes Doppelzitat (in "Officejet_Pro_8600$) - Jacob Vlijm
Ja, die Vermutung war richtig. Könnte ein Fehler in ihrer Benachrichtigung sein, möglicherweise nicht. Sie haben eine Menge Rohre mit grep, also überprüfen Sie diese auch, bevor Sie den finalen Abschluss machen. - Sergiy Kolodyazhnyy
@Serg Ja, klar ein Fehler in hplip: "Officejet_Pro_8600$ - eine falsche Benachrichtigung ... - Jacob Vlijm
in diesem Fall vielleicht verwenden tr -d '"' die Anführungszeichen löschen? - Sergiy Kolodyazhnyy


Antworten:


Von man xargs:

--delimiter = abgrenzen
-d Trennzeichen
      Eingabeelemente werden mit dem angegebenen Zeichen abgeschlossen. Zitate
      und Backslash sind nicht speziell; Jedes Zeichen in der Eingabe ist
      wörtlich genommen.   Deaktiviert die Dateiendezeichenfolge
      behandelt wie jedes andere Argument. Dies kann verwendet werden, wenn die
      Die Eingabe besteht aus einfach durch Zeilenumbrüche getrennten Elementen, obwohl dies der Fall ist
      fast immer besser, dein Programm zu entwerfen, um --null wo zu verwenden
      Das ist möglich. Der angegebene Begrenzer kann ein einzelner sein
      Zeichen, ein C-Style-Zeichen-Escape wie \ n, oder ein Oktal oder
      hexadezimaler Escape-Code. Oktal- und hexadezimale Escape-Codes sind
      verstanden wie für den printf-Befehl. Multibyte-Zeichen sind
      nicht unterstützt.

Als Beispiel:

$ 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 ' ' 
"""

Natürlich kann die Verwendung von beiden Dinge brechen, aber vielleicht nicht so viel wie -0.


3
2017-10-29 00:51



Der zweite zeigt an, dass die Ausgabe immer den vorletzten -on anzeigt. Der erste scheint die Arbeit gut zu machen, aber mit allem, was ich bisher probiert habe, zeigt sich sogar die hplip-Benachrichtigung richtig :). Danke dafür! - Jacob Vlijm