Como posso resolver o erro de “aspas duplas incomparáveis” usando o dbus-monitor em combinação com xargs?

6

Para interceptar notificações ( notify-osd ) no Linux (Ubuntu), estou usando o script dbus-monitor abaixo. Posteriormente, o script executa outro script ( /opt/nonotifs/nonotifs/silent ) com a notificação interceptada como argumento, para processamento adicional:

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

Isso funciona perfeitamente, exceto com notificações por hplip .

Quando executado a partir de um terminal, o script acima mostra:

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

Ao usar a opção -0 , o script não fornece nenhum argumento.

O que eu tentei

Em alguns casos, o script é interrompido. Se isso fosse sempre o caso, poderia ser contornado executando-o em um wrapper "keep alive", que eu tentei. Muitas vezes, no entanto, o script não termina, mas deixa de retornar as notificações interceptadas, no entanto.

Como posso resolver isso?

Editar

Como sugerido por @Serg, substituí a seção xargs... por cat -A para ver o que é passado para xargs . Isso mostra que, de fato, existe uma aspas duplas não correspondidas na notificação de hplip (a terceira linha), o que parece ser um erro na notificação.

A saída ao executar com cat -A , chamando a notificação:

"hplip"$ 
"HPLIP Device Status"$ 
"Officejet_Pro_8600$ 
"transient"$
    
por Jacob Vlijm 28.10.2016 / 22:06

1 resposta

3

De 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.

Como exemplo:

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

Claro, usar qualquer um pode quebrar as coisas, mas talvez não tanto quanto -0 .

    
por muru 29.10.2016 / 02:51