Как я могу решить “несопоставленную двойную кавычку” ошибка с помощью dbus-монитора в сочетании с xargs?

Прерывать (notify-osd) уведомления на Linux (Ubuntu), я использую dbus-monitor сценарий ниже. Впоследствии, сценарий запускает другой скрипт (/opt/nonotifs/nonotifs/silent) с прерванным уведомлением как аргумент, для последующей обработки:

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

Это работает безупречно, кроме с уведомлениями hplip.

enter image description here

Когда выполнено от терминала, сценария выше шоу:

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

При использовании опции -0 однако, сценарий не поставляет аргумента вообще.

Что я попробовал

В некоторых случаях сценарий впоследствии повреждается. Если это всегда имело бы место, Это могло бы работаться вокруг путем выполнения его в "поддержании" - обертка, которую я попробовал. Часто однако сценарий не завершается, но он прекращает возвращать прерванные уведомления, тем не менее.

Как я могу решить это?

Править

Как предложено @Serg, я заменил xargs... раздел cat -A, видеть, что передается xargs. Это показывает, что действительно существует несопоставленная двойная кавычка в уведомлении о hplip (третья строка), который, кажется, ошибка в уведомлении.

Вывод при выполнении с cat -A, вызов уведомления:

"hplip"$ 
"HPLIP Device Status"$ 
"Officejet_Pro_8600$ 
"transient"$
7
задан 29 October 2016 в 10:18

1 ответ

От man xargs:

--delimiter=delim
-d delim
      Input  items  are terminated by the specified character.  Quotes
      and backslash are not special; every character in the  input  is
      taken  literally.   Disables  the  end-of-file  string, which is
      treated like any other argument.  This  can  be  used  when  the
      input consists of simply newline-separated items, although it is
      almost always better to design your program to use --null  where
      this  is  possible.   The  specified  delimiter  may be a single
      character, a C-style character escape such as \n, or an octal or
      hexadecimal escape code.  Octal and hexadecimal escape codes are
      understood as for the printf command.   Multibyte characters are
      not supported.

Как пример:

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

, Конечно, с помощью любого может повредить вещи, но возможно не так как -0.

3
ответ дан 23 November 2019 в 06:51

Другие вопросы по тегам:

Похожие вопросы: