Wie kann ich mit dbus-monitor in Kombination mit xargs den Fehler „unübertroffenes Anführungszeichen“ lösen?

8

Um ( notify-osd) Benachrichtigungen unter Linux (Ubuntu) abzufangen , verwende ich das folgende dbus-monitorSkript. Anschließend führt das Skript ein weiteres Skript ( /opt/nonotifs/nonotifs/silent) mit der abgefangenen Benachrichtigung als Argument zur weiteren Verarbeitung aus:

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

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

Geben Sie hier die Bildbeschreibung ein

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

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

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

Was ich versucht habe

In einigen Fällen wird das Skript anschließend unterbrochen. Wenn dies immer der Fall wäre, könnte es umgangen werden, indem es in einem "Keep Alive" -Wrapper ausgeführt wird, den ich ausprobiert habe. Oft wird das Skript jedoch nicht beendet, aber die zurückgegebenen Benachrichtigungen werden trotzdem nicht mehr zurückgegeben.

Wie kann ich das lösen?

Bearbeiten

Wie von @Serg vorgeschlagen, habe ich den xargs...Abschnitt durch ersetzt cat -A, um zu sehen, an was übergeben wird xargs. Dies zeigt, dass die Benachrichtigung von (die dritte Zeile) tatsächlich ein unübertroffenes doppeltes Anführungszeichen enthälthplip , was ein Fehler in der Benachrichtigung zu sein scheint.

Die Ausgabe beim Ausführen mit cat -A, Aufruf der Benachrichtigung:

"hplip"$ 
"HPLIP Device Status"$ 
"Officejet_Pro_8600$ 
"transient"$
Jacob Vlijm
quelle
1
Meine Vermutung wäre, dass das, was an xargs weitergegeben wird, ein doppeltes Anführungszeichen enthält. Versuchen Sie dies zu überprüfen, indem Sie cat -Astatt xargsdort
ersetzen
@Serg du hast vollkommen recht! Sei es, dass es ein Fehler in der HP-Benachrichtigung scheint. Es gibt aus "hplip"$ "HPLIP Device Status"$ "Officejet_Pro_8600$ "transient"$, was in der Tat ein unübertroffenes doppeltes Zitat (in "Officejet_Pro_8600$) zeigt
Jacob Vlijm
Ja, die Vermutung war richtig. Könnte ein Fehler in ihrer Benachrichtigung sein, könnte es nicht sein. Sie haben eine ganze Reihe von Pfeifen mit grep, überprüfen Sie diese also auch, bevor Sie die endgültige Schlussfolgerung ziehen.
Sergiy Kolodyazhnyy
@Serg Ja, eindeutig ein Fehler in hplip: "Officejet_Pro_8600$- eine falsche Benachrichtigung ...
Jacob Vlijm
in diesem Fall vielleicht verwenden tr -d '"', um die doppelten Anführungszeichen zu löschen?
Sergiy Kolodyazhnyy

Antworten:

3

Von man xargs:

--delimiter = delim
-d delim
      Eingabeelemente werden mit dem angegebenen Zeichen abgeschlossen.  Zitate
      und Backslash sind nichts Besonderes; Jedes Zeichen in der Eingabe ist
      wörtlich genommen.    Deaktiviert die Zeichenfolge für das Dateiende
      wie jedes andere Argument behandelt. Dies kann verwendet werden, wenn die
      Die Eingabe besteht aus einfach durch Zeilenumbrüche getrennten Elementen, obwohl dies der Fall ist
      Fast immer ist es besser, Ihr Programm so zu gestalten, dass es verwendet wird - null wo
      Das ist möglich. Das angegebene Trennzeichen kann ein einzelnes Trennzeichen sein
      Zeichen, ein C-Zeichen-Escape wie \ n oder ein Oktal oder
      hexadezimaler Escape-Code. Oktale und hexadezimale Escape-Codes sind
      verstanden wie für den Befehl printf. 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 beidem Dinge zerstören, aber vielleicht nicht so viel wie -0.

muru
quelle
Bei der zweiten Ausgabe wird in der Ausgabe immer die vorletzte angezeigt. Der erste scheint den Job gut zu machen, aber mit fast allem, was ich bisher versucht habe, zeigt er sogar die hplip-Benachrichtigung korrekt :). Danke dafür!
Jacob Vlijm