如何使用 dbus-monitor 与 xargs 结合解决“不匹配的双引号”错误?

如何使用 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”包装器中运行它来解决,我试过了。然而,通常情况下,脚本不会终止,但它会停止返回拦截的通知。

我该如何解决这个问题?

编辑

根据@Serg的建议,我将xargs...部分替换为cat -A,以查看传递给的内容xargs。这表明确实有一个不匹配的双引号在(第三行)的通知中hplip,这似乎是通知中的一个错误。

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

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

答案1

man xargs

--delimiter=分隔符
-d 分隔符
      输入项以指定字符终止。  引号
      和反斜杠不是特殊字符;输入中的每个字符都是
      从字面上理解。   禁用文件结束字符串,即
      像其他参数一样处理。这可以在以下情况下使用:
      输入仅由换行符分隔的项目组成,尽管
      几乎总是更好地设计你的程序以使用--null
      这是可能的。指定的分隔符可以是单个
      字符、C 样式字符转义符(例如 \n)或八进制或
      十六进制转义码。八进制和十六进制转义码是
      理解为 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

相关内容