Как я могу использовать «уведомить-отправить», чтобы немедленно заменить существующее уведомление?

Вы не можете удалить этот сервис, но вы можете развернуть новый сервис с таким же очарованием:

juju deploy rabbitmq-server rabbitmq

... и вы даже можете поставить его на тот же машина, если вы хотите:

juju deploy rabbitmq-server rabbitmq --to 

... но вы можете обновить ваш клиент и запустить:

juju upgrade-juju

... чтобы ваша среда работала 1.16.5, в котором эта ошибка устранена. Это не исправит среду, которая уже находится в такой ситуации, но предотвратит ее повторение с новым сервисом.

23
задан 20.01.2020, 21:40

4 ответа

Вы можете, но вы должны использовать исправленный libnotify , чтобы сделать это

notify-send не имеет возможности заменить существующие уведомления до того, как они истекли (или исчезли). Это известная ошибка . Тем не менее, комментатор в отчете об ошибке опубликовал патч для его исправления.

Установка исправленной libnotify-bin из PPA

Я создал исправленную версию пакета 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 будет возвращать идентификатор N (число / целое число).
  • Выдача другого notify-send с -r N заменит предыдущее уведомление немедленно .
  • Например, для bash вы можете сохранить идентификатор из notify-send -p ... с помощью:

    NID=$(notify-send -p "MESSAGE-1")
    

    и затем заменить его на:

    notify-send -r $NID "MESSAGE-2"
    
  • Вы можете рекурсивно использовать в скрипте как -p , так и -r , если переменная -r инициализируется в 0 в начале. [тысячу сто сорок одна] [1 133]

  • Вот простой скрипт, который показывает количество уведомлений от 0 до 100 с интервалом в полсекунды:

    #!/bin/bash
    NID=0
    for i in {0..100..10}    do       NID=$(notify-send -p -r $NID $i)       sleep 0.5    done
16
ответ дан 20.01.2020, 21:42

Вы можете использовать «синхронную» подсказку, чтобы создать «подтверждающее» уведомление, которое заменит предыдущие подтверждающие уведомления. Например:

notify-send "Message" -h string:x-canonical-private-synchronous:anything

Подсказка «x-canonical-private-synchronous» указана в этого документа . Чтобы указать подсказку, используйте -h type:name:value. Тип здесь - string, имя - x-canonical-private-synchronous, и кажется, что значение может быть любым, что вы хотите.

Таким образом, если ваше первое уведомление создано с помощью этой подсказки и , второе тоже будет, второе немедленно заменит первое. (См. Анимации и длительности в документации, в столбце «пузыри подтверждения».)

11
ответ дан 20.01.2020, 21:40
  • 1
    Это doesn' t работают с GNOME.... – aberrant80 20.01.2020, 21:41
  • 2
    string:x-canonical-private-synchronous:anything был точно, в чем я нуждался. Спасибо за этот ответ. Также для соединения с документацией – Alceu Costa 20.01.2020, 21:41
  • 3
    Это несколько очевидно только работает над человечностью. – akarnokd 20.01.2020, 21:42

X-ref:
Как заставить новое Уведомление в notify-osd появляться, не дожидаясь выхода предыдущего?

без исправлений можно просто сделать

#!/bin/bash

for i in {0..100..10}
    do
          killall notify-osd
          notify-send "testing" $i
          sleep 1
    done

Закладка:
Как использовать «уведомить-отправить», чтобы немедленно заменить существующее уведомление?

<час> [119 ] Отправляет ошибку notify-osd (2592): операция не разрешена. Что это значит?

Это может означать, что привилегии неадекватны и требуют:

sudo killall notify-osd
10
ответ дан 20.01.2020, 21:41

Я создал простой скрипт на python, который работает почти так же, как notify-send, но поддерживает --replaces-id.

notify-send.py

веб: https://github.com/phuhl/notify-send.py

A скрипт Python для отправки уведомлений на рабочий стол из оболочки.

О

Libnotify является частью многих скриптов в мире Linux. Он использует многие из указанных функций спецификации уведомлений рабочего стола и делает их доступными для сценариев оболочки. Он не , однако позволяет заменить существующее уведомление на replaces-id. Это известная ошибка с 2008 года и патч с 2012 года. Патч все еще не вышел (2018).

Этот скрипт на python использует пакет notify2 и предоставляет функциональность оболочке.

Различия между notify-send.py и notify-send

  • В notify-send.py -h отображается справка, а не параметр для подсказок. Для подсказок используйте --hint.
  • В notify-send.py -r ID и notify-send.py --replaces-id ID существует. Чтобы заменить уведомление, позвоните notify-send.py с идентификатором, который был возвращен уведомлением, подлежащим замене.
  • notify-send.py возвращает идентификатор вновь созданного уведомления.
  • notify-send.py --replaces-process NAME существует. Каждое уведомление, созданное с тем же ИМЯ, заменит каждое уведомление перед тем же ИМЯ. При вызове с этим параметром notify-send.py может блокироваться, лучше всего вызываться с трейлингом &.

Установка

Требуется python3.

git clone https://github.com/phuhl/notify-send.py
cd notify-send.py
sudo pip install notify2
sudo python setup.py install

Использование

$ 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
[1141 ] используется пользователем 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 "$@" &

См. Также

Также взгляните на моего уведомления-демона , вдохновленного Данст , но с несколькими улучшениями, включая возможность прозрачного фона и центра уведомлений, в котором хранятся уведомления.

5
ответ дан 20.01.2020, 21:41

Теги

Похожие вопросы