Как я могу решить проблему "непревзойденной двойной кавычки", используя dbus-monitor в сочетании с 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,

При запуске из терминала приведенный выше скрипт показывает:

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

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

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

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

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

редактировать

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

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

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

1 ответ

Решение

От man xargs:

 --delimiter = DELIM
-делим
      Элементы ввода завершаются указанным символом. Цитаты 
       и обратный слеш не особенный; каждый символ на входе 
       в буквальном смысле. Отключает строку конца файла, которая
      рассматривается как любой другой аргумент. Это можно использовать, когда
      ввод состоит из элементов, разделенных новой строкой, хотя
      почти всегда лучше разрабатывать свою программу для использования --null где
      это возможно. Указанный разделитель может быть одним
      символ, экранирование символа в стиле C, например \ n, или восьмеричное или
      шестнадцатеричный escape-код. Восьмеричные и шестнадцатеричные коды перехода
      понимается как для команды printf. Многобайтовые символы
      не поддерживается.

В качестве примера:

$ 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,

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