为了在 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
。