如何清除 bash 中的气球弹出窗口

如何清除 bash 中的气球弹出窗口

我正在脚本中设置通知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(可能是自定义应用程序)。


实现你的目标的一个可能的粗暴的黑客是使用脚本自动化工具。您可以使用它们找到所有通知弹出窗口上的“关闭”按钮,并模拟鼠标单击每个按钮。但这并不容易,当然也不是整洁的解决方案。

相关内容