在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
时,脚本不提供任何参数。
我尝试过的方法
在某些情况下,脚本随后会出现错误。如果总是这样,可以通过在“保持活动”包装器中运行它来解决,我已经尝试过了。然而,通常情况下,脚本不会终止,但它仍然停止返回拦截的通知。
我该如何解决这个问题?
编辑
如@Serg所建议的那样,我用cat -A
替换了xargs...
部分,以查看传递给xargs
的内容。这表明,在hplip
的通知中确实存在一个未匹配的双引号(第三行),这似乎是通知中的一个错误。
使用cat -A
调用通知时的输出:
"hplip"$
"HPLIP Device Status"$
"Officejet_Pro_8600$
"transient"$
cat -A
替换xargs
来验证一下。 - Sergiy Kolodyazhnyy"hplip"$ "HPLIP设备状态"$ "Officejet_Pro_8600$ "transient"$
,其中确实显示了一个不匹配的双引号(在"Officejet_Pro_8600$
)。 - Jacob Vlijm"Officejet_Pro_8600$
- 一个不正确的通知... - Jacob Vlijmtr -d '"'
命令删除双引号? - Sergiy Kolodyazhnyytr -d '"'
是用来删除特定字符的命令。所以,你想把它放在最后一个grep
和xargs
之间,试试这样:grep --line-buffered -v '^\s*$' | tr -d '"' | xargs . . . .
当然,并不是理想的解决方案,但至少你不必再处理无法匹配的双引号了。 - Sergiy Kolodyazhnyy