我正在脚本中设置通知notify-send
。唯一的问题是,当多次调用该脚本时,所有通知都会添加到通知堆栈中,并且只会一个接一个地调用。
有没有办法清除屏幕上的所有通知并显示新的通知?
答案1
不幸的是,你不能清除或“忽略”notify-osd
通知。使用禅意相反,它有更多的选择比通知发送。
您可以使用--timeout
选项在一定秒数后关闭通知。
zenity --info --timeout=5 --title="Test Notification" --text "$(date +%Y%m%d-%H%M%S): My notification"
您还可以保留以前通知的进程 ID 列表(在环境变量或文件中),并HUP
在显示新通知之前向它们发送信号以清除它们。
i=0
pids=
for x in $(seq 1 5); do
i=$((i + 1))
zenity --info --title="Test Multiple Notifications" --text "$(date +%Y%m%d-%H%M%S): Notification number $i" &
pids+="$! "
done
sleep 5
for p in $pids; do kill -HUP $p >/dev/null 2>&1; done
i=$((i + 1))
zenity --info --timeout=2 --title="Test Multiple Notifications" --text "$(date +%Y%m%d-%H%M%S): Notification number $i" &
zenity
或者在显示新通知之前终止所有进程:
killall zenity
zenity --info --title="Test Notifications" --text "$(date +%Y%m%d-%H%M%S): My notification" &
zenity
或者在显示新通知之前终止某些进程:
ps ho pid,args | grep -i 'zenity.\+--title=test notifications' | sed -e 's/^ *\([0-9]\+\).*$/\1/'
zenity --info --title="Test Notifications" --text "$(date +%Y%m%d-%H%M%S): My notification" &
答案2
这实际上是使用通知发送 (notify-send) 可行的:
notify-send --hint int:transient:1 "Title" "Body"
通过设置transient
提示,当通知过期或关闭时,它不会在通知栏中停留。
答案3
也许这不是最好的选择,但这里有一个替代方案:您可以简单地终止该notify-osd
进程并重新启动它。然后发布您的通知。
pkill notify-osd
/usr/lib/x86_64-linux-gnu/notify-osd &
notify-send "Hello!"
答案4
不幸的是,这似乎不适用于由 设置的通知notify-send
。请查看notify-send.c 源代码- 它创建一个通知,设置其参数,但不在任何地方存储对它的任何引用。相反,它调用g_object_unref
,据我了解这里,有效地消除了外部与消息交互的可能性。因此,要对通知拥有高级管理权,您需要使用不同的工具notify-send
(可能是自定义应用程序)。
实现你的目标的一个可能的粗暴的黑客是使用脚本自动化工具。您可以使用它们找到所有通知弹出窗口上的“关闭”按钮,并模拟鼠标单击每个按钮。但这并不容易,当然也不是整洁的解决方案。