当前位置: 首页>>技术教程>>正文


如何使用 ‘notify-send’ 立即替换现有通知?

, , ,

问题描述

当我使用 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。)

第三种回答

X-ref:\n How to force a new Notification in notify-osd to show up without waiting for the earlier one to exit?

没有补丁,你可以简单地做

#!/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 IDnotify-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 ,但有一些改进,包括透明背景和存储通知的通知中心的可能性。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14075.html,未经允许,请勿转载。