如何使用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
那么多。