问题描述
当我使用 notify-send
在桌面上显示通知,然后再次使用它显示不同的通知时,我注意到第二个通知仅在第一个通知消失后才显示。
有没有办法让 notify-send
立即用其他通知替换现有通知?
最佳回答
可以,但必须使用修补过的 libnotify 来执行此操作(更新:自 22.10 起不再需要)
notify-send
无法在现有通知超时(或消失)之前替换它们。这是 known bug 。然而,错误报告 has posted a patch 上的评论者修复了它。
更新:该补丁已合并到 libnotify 0.7.10 中,该版本于 2022 年 4 月 27 日发布,并首次包含在 Ubuntu 22.10 中。
从 PPA 安装已修补的 libnotify-bin
我创建了 libnotify-bin 包的修补版本,允许在我的 PPA 中进行替换。目前它仅适用于 Ubuntu 12.04,但如果您需要任何其他当前支持的版本,请发表评论,我将尽力提供它。
要安装,请打开终端并:
sudo apt-add-repository ppa:izx/askubuntu
sudo apt-get update
sudo apt-get install libnotify-bin
如何使用替换功能
修补后的 notify-send
包括两个新开关: -p
(或 --print-id
)和 -r
(或 --replace-id
)。 --help
将它们描述为:
-p, --print-id Print the notification ID.
-r, --replace-id=REPLACE_ID The ID of the notification to replace.
-
对于
-p
,每个notify-send
将输出一个 ID N(数字/整数)。\n -
使用
-r N
发出另一个notify-send
将立即替换之前的通知。\n -
例如,对于 bash,您可以使用以下命令保存
notify-send -p ...
中的 ID:\n
NID=$(notify-send -p "MESSAGE-1")\n
\n
然后将其替换为:
\n
notify-send -r $NID "MESSAGE-2"\n
\n
-
您可以在脚本中重复使用
-p
和-r
,只要-r
ID 在开始时初始化为 0。\n -
下面是一个简单的脚本,显示以 half-second 为间隔从 0 计数到 100 的通知:
\n
#!/bin/bash\nNID=0\nfor i in {0..100..10}; do\n NID=$(notify-send -p -r $NID $i)\n sleep 0.5\ndone\n
\n
次佳回答
您可以使用 “synchronous” 提示创建 “confirmation” 通知来替换以前的确认通知。例如:
notify-send "Message" -h string:x-canonical-private-synchronous:anything
“x-canonical-private-synchronous”提示在 this document 中指定。要指定提示,请使用 -h type:name:value
。这里的类型是 string
,名称是 x-canonical-private-synchronous
,看起来值可以是任何你想要的。
因此,如果您的第一个通知是使用该提示创建的,并且第二个通知也是如此,则第二个通知将立即替换第一个通知。 (请参阅文档中 “confirmation bubbles” 列中的 Animations and Durations。)
第三种回答
没有补丁,你可以简单地做
#!/bin/bash
for i in {0..100..10}
do
killall notify-osd
notify-send "testing" $i
sleep 1
done
书签:\n How do I use ‘notify-send’ to immediately replace an existing notification?
发送错误 notify-osd(2592):不允许操作。这意味着什么?
这可能意味着权限不够,需要:
sudo killall notify-osd
第四种回答
我创建了一个简单的 python 脚本,其工作方式与 notify-send 几乎相同,但支持 --replaces-id
。
notify-send.py
网址:https://github.com/phuhl/notify-send.py
用于从 shell 发送桌面通知的 python 脚本。
About
Libnotify 是 Linux 世界中许多脚本的一部分。它利用了桌面通知规范的许多\n指定功能,并使得 shell-scripts 可以访问它们。但\n它不允许用 replaces-id
替换现有通知。这是自 2008 年以来已知的 bug,自 2012 年以来有一个 patch。尽管如此(2018 年),该补丁仍然不是上游。
此 Python 脚本利用了 notify2 包并向 shell 公开\n功能。
notify-send.py 和 notify-send 之间的区别
-
在
notify-send.py -h
中显示帮助而不是\n提示参数。如需提示,请使用--hint
。 -
在
notify-send.py -r ID
和notify-send.py --replaces-id ID
中\n存在。为了替换通知,请使用要替换的通知返回的 ID 调用notify-send.py
\n。 -
notify-send.py
返回新创建的通知的 ID。 -
notify-send.py --replaces-process NAME
存在。\n使用相同名称创建的每个通知都将替换\n之前具有相同名称的通知。如果使用此参数调用notify-send.py
可能会阻塞,最好使用尾随&
进行调用。
Installation
需要 python3。
git clone https://github.com/phuhl/notify-send.py
cd notify-send.py
sudo pip install notify2
sudo python setup.py install
Usage
$ notify-send.py -h
usage: notify-send.py [-h] [-u LEVEL] [-t TIME] [-a APP_NAME]
[-i ICON[,ICON...]] [-c TYPE[,TYPE...]]
[--hint TYPE:NAME:VALUE] [-r ID]
[--replaces-process NAME]
SUMMERY [BODY]
positional arguments:
SUMMERY
BODY
optional arguments:
-h, --help show this help message and exit
-u LEVEL, --urgency LEVEL
Specifies the urgency level (low, normal, critical).
-t TIME, --expire-time TIME
Specifies the timeout in milliseconds at which to
expire the notification.
-a APP_NAME, --app-name APP_NAME
Specifies the app name for the icon
-i ICON[,ICON...], --icon ICON[,ICON...]
Specifies an icon filename or stock icon to display.
-c TYPE[,TYPE...], --category TYPE[,TYPE...]
Specifies the notification category.
--hint TYPE:NAME:VALUE
Specifies basic extra data to pass. Valid typesare
int, double, string and byte.
-r ID, --replaces-id ID
Specifies the id of the notification that should be
replaced.
--replaces-process NAME
Specifies the name of a process that should take care
of replacing notifications for this process.
notify-send[.py] 作为 root 用户
为了显示通知,即使 libnotify 或
notify-send.py
从 root 用户使用这两个脚本很有帮助。
#!/bin/bash
username=<your username here>
if [ "$(id -u)" != "1000" ] ; then
sudo -u $username DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send.sh "$@"
else
notify-send.sh "$@"
fi
像这样的 notify-send.sh
:
#!/bin/bash
notify-send.py "$@" &
也可以看看
另请看看我的 notification-daemon ,其灵感来自 Dunst ,但有一些改进,包括透明背景和存储通知的通知中心的可能性。