在我的脚本中,我向用户发送通知并提示他输入一些数据。之后我想清除之前发送的通知。通知应该留在托盘中,直到用户输入数据。
目前我正在使用notify-send
,但只有通过超时才能清除。
我想要的是这样的:
send-notification --title="Hey, enter some data pls" --id=999
prompt-to-enter-data
delete-notification --id=999
我正在使用 Linux Mint 20。带有 cinnamon DE(v4.6.6)。
notify-osd
未安装。
答案1
这是可能的,但不能用notify-send
。您需要使用不太专业的工具(如 )与您的桌面通知服务对话gdbus
。它将允许您从 shell 调用各种方法。
另一种方法是dbus-send
,但它(至少目前)不支持variant
该方法所需的类型org.freedesktop.Notifications.Notify
。我们将坚持使用gdbus
。
查看man 1 gdbus
。它包含一个发送通知的示例:
gdbus call --session \ --dest org.freedesktop.Notifications \ --object-path /org/freedesktop/Notifications \ --method org.freedesktop.Notifications.Notify \ my_app_name \ 42 \ gtk-dialog-info \ "The Summary" \ "Here's the body of the notification" \ [] \ {} \ 5000
这应该会打印通知 ID(uint32 42,)
在哪里42
。实际上,示例42
明确指定,这意味着如果已经有一个具有此确切 ID 的通知,那么它将被替换。要创建全新的通知,请指定0
。硬编码 ID(如999
您的问题中所示)是可能的,但如果该 ID 已被一些不相关的、可能很重要的通知占用怎么办?为此,请指定0
,捕获输出,隔离新 ID 并将其与一起使用org.freedesktop.Notifications.CloseNotification
。
有用的链接:
示例脚本:
#!/bin/sh
tty="$(tty)"
id="$(gdbus call --session \
--dest org.freedesktop.Notifications \
--object-path /org/freedesktop/Notifications \
--method org.freedesktop.Notifications.Notify \
my_script \
0 \
utilities-terminal \
"Response required" \
"Script awaiting input ($tty)." \
[] \
{} \
0
)"
id="${id##* }"
id="${id%,)}"
printf 'Type here and hit Enter: '
read foo
>/dev/null gdbus call --session \
--dest org.freedesktop.Notifications \
--object-path /org/freedesktop/Notifications \
--method org.freedesktop.Notifications.CloseNotification \
"$id"