Прерывать (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
однако, сценарий не поставляет аргумента вообще.
В некоторых случаях сценарий впоследствии повреждается. Если это всегда имело бы место, Это могло бы работаться вокруг путем выполнения его в "поддержании" - обертка, которую я попробовал. Часто однако сценарий не завершается, но он прекращает возвращать прерванные уведомления, тем не менее.
Как я могу решить это?
Как предложено @Serg, я заменил xargs...
раздел cat -A
, видеть, что передается xargs
. Это показывает, что действительно существует несопоставленная двойная кавычка в уведомлении о hplip
(третья строка), который, кажется, ошибка в уведомлении.
Вывод при выполнении с cat -A
, вызов уведомления:
"hplip"$
"HPLIP Device Status"$
"Officejet_Pro_8600$
"transient"$
От 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
.