如何使用dbus-monitor结合xargs解决“无与伦比的双引号”错误?

要在Linux(Ubuntu)上拦截( notify-osd )通知,我使用下面的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”-wrapper中运行它来解决它,我试过了。 但是,通常,脚本不会终止,但它会停止返回截获的通知。

我怎么解决这个问题?

编辑

正如@Serg所建议的,我用cat -A替换了xargs...部分,以查看传递给xargs 。 这表明确实在hplip (第三行)的通知中有一个无与伦比的双引号 ,这似乎是通知中的一个错误。

使用cat -A运行时的输出,调用通知:

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

来自man xargs

 对齐和美化--delimiter = DELIM
 -d delim
      输入项目由指定的字符终止。  行情 
        反斜杠并不特别;  输入中的每个字符都是 
        从字面上看。 禁用文件结束字符串,即
      像任何其他论点一样对待。 这可以在使用时使用
      输入包含简单的换行项目,尽管它是
      几乎总是更好地设计你的程序使用 - 无处不在
      这个有可能。 指定的分隔符可以是单个分隔符
      字符,C风格的字符转义符,如\ n,或八进制或
      hex转义码。 八进制和hex转义码是
      理解为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那么多。