Як я можу запустити сповіщення Центру сповіщень із сценарію AppleScript або оболонки?


305

Я хотів би мати можливість скористатися функціями Центру сповіщень 10,8 в AppleScripts і скриптах оболонок, які я пишу.

Чи є вбудована команда або стороння бібліотека, яку я можу використовувати або з сценарію AppleScript, або з оболонки?

В ідеалі можна було б контролювати тип та піктограму сповіщення, але навіть цінуватиметься лише можливість запускати основний банер із значком запасу (але спеціальним текстом).


Відповіді:


428

З Mavericks і пізнішими версіями ви можете це зробити, використовуючи "Дисплейне повідомлення" AppleScript:

display notification "Lorem ipsum dolor sit amet" with title "Title"

                          

Це все - буквально так просто! Ні 3 - я сторона він бібліотеки або програми не потрібно , і повністю портативний для використання в інших системах. 10.9 повідомлення вгорі, 10.10 DP посередині, 10.10 знизу.

AppleScript можна запустити з оболонки за допомогою / usr / bin / osascript:

osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'

Ви також можете додатково налаштувати попередження, додавши…

  • підзаголовок

    Додайте «підзаголовок», а потім рядок або змінну, що містить підзаголовки.

    display notification "message" with title "title" subtitle "subtitle"

    Наведений вище приклад створює таке повідомлення:

  • звук

    Додайте "ім'я звуку", а потім назву звуку, який буде відтворюватися разом із повідомленням.

    display notification "message" sound name "Sound Name"

    Дійсні звукові назви - це назви звуків, розташованих у…

    • ~/Library/Sounds
    • /System/Library/Sounds

Опублікування сповіщень може бути завершено як сценарій командного рядка. Наступний код можна запустити в Terminal і додасть сценарій до / usr / local / bin (повинен існувати, додати до $ PATH) notify.

cd /usr/local/bin && echo -e "#!/bin/bash\n/usr/bin/osascript -e \"display notification \\\"\$*\\\"\"" > notify && chmod +x notify;cd -

Це сценарій, який буде додано вище для сповіщення.

#!/bin/bash
/usr/bin/osascript -e "display notification \"$*\""

Тепер для відображення сповіщення:

notify Lorem ipsum dolor sit amet
sleep 5; notify Slow command finished

9
@ceilingcat Це AppleScript. Щоб запустити його в Terminal, використовуйте osascript (див. Відповідь).
гр

8
Єдина проблема display notificationполягає в тому, що при натисканні на неї з'являється діалогове вікно відкритого файлу.
ƃoƃı

7
Чи можливо змусити спливаюче повідомлення notificatiop існувати назавжди (не автоматично приховуватись через N секунд), поки користувач явно не натиснув його?
Шрідхар Ратнакумар

25
Пані, панове, після години розслідування у всесвітній мережі, я дізнався, як дозволити вікно сповіщень залишатися, поки користувач не відпустить його! Це фактично контролювалося налаштуванням у System Preference, а не якимсь параметром у написаному сценарії. Ці два зображення повинні пояснити це все i.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg Повеселіться, хлопці, і дякую @grgarside за чудову відповідь.
Вік Ян

4
Зауважте, що текст має бути у подвійних лапках. Одиночні котирування не працюють. Так що якщо вам потрібна змінна в тексті, ви не можете писати "display ... '$mytext' ...", але потрібно врятувався подвійні лапки: "display notification \"$mytext\" ...".
mivk

93

термінал-сповіщувач

З ПРОЧИТАННЯ:

термінал-сповіщувач - це інструмент командного рядка для надсилання сповіщень користувача Mac OS X, який доступний у Mac OS X 10.8.

В даний час він упакований у вигляді пакету програм, оскільки NSUserNotificationне працює від "інструменту Foundation". радар: // 11956694

Цей інструмент Kicker використовуватиме для показу статусу команд, які виконуються через зміни файлової системи. (v3.0.0)

Завантажити

Попередньо вбудовані бінарні файли, які підписані кодом та готові до використання, доступні у розділі завантажень .

Використання

$ ./terminal-notifier.app/Contents/MacOS/terminal-notifier group-ID sender-name message [bundle-ID]

Щоб використовувати термінал-сповіщувач, вам потрібно зателефонувати в двійковий файл всередині додатка.

Перший аргумент визначає "групу", до якої належить повідомлення. Для будь-якої "групи" колись відображатиметься лише одне повідомлення, замінюючи раніше розміщені сповіщення. Прикладами є: ідентифікатор процесу відправника для охоплення сповіщень унікальним процесом, або поточний робочий каталог для охоплення сповіщень проектом.

Другий та третій аргументи описують саме сповіщення та є його "заголовком" та "повідомленням" відповідно. Наприклад, щоб повідомити відправника сповіщення користувачеві, ви можете вказати ім'я відправника як заголовок.

Четвертий і останній аргумент - необов’язковий. Він визначає, яку програму потрібно активувати, коли користувач натискає сповіщення. За замовчуванням це активує Terminal.app, щоб запустити іншу програму, а не вказати ідентифікатор пакета програми. Наприклад, щоб запустити використання Safari.app: com.apple.Safari.


Солодке, чудова бібліотека! Хочеться, щоб він оновлювався з контролем над значком та попередженням проти банера, але, безумовно, корисним. Дякуємо за посилання! i.imgur.com/tsCeK.png
Натан Грінштейн

2
Чудовий маленький додаток, я створив запуск і поставив / usr / local / bin, щоб я міг використовувати його будь-де з терміналу тощо. Сценарій запуску: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/ MacOS ./terminal-notifier $ *
johanandren

4
Launcher корисний, якщо його трохи змінити, він працює з цитованим текстом з пробілами: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard

27

Я просто хочу додати примітку до відповіді @ grgarside, тому що я знаю, що багато людей хочуть мати спливаюче повідомлення, яке може бути відхилено лише натисканням кнопки.

Порівняння

Я знайшов рішення для вас:

Це фактично контролювалося налаштуванням у System Preference, а не якимсь параметром у написаному сценарії. Ці два зображення повинні все це пояснити

Дякую @grgarside за чудову відповідь.

Налаштування системи


5
Зауважте, що конкретна програма буде відрізнятися. Script Editorє лише для Script Editor.appі osascript. У робочому процесі обслуговування це так Automator Runner. Коли всередині Automator.app- це Automator.
cde

1
Мені прикро, що якщо натиснути на Банер, це відкриє програму редактора сценаріїв. Я хотів би, щоб він просто зникав при натисканні, але ця публікація вказує, що ви можете навести курсор на неї та проведіть трекпад праворуч, щоб тихо пройти: osxdaily.com/2012/09/05/…
Джошуа Голдберг,

@JoshuaGoldberg Дякуємо, що додали це! Я зрозумів, що одного дня інтуїтивно зрозуміло, що мені подобається в Mac OS X, і це працює так, як ви очікуєте, що це працює :)
Вік Ян

22

Тепер це можна зробити за допомогою Growl2 ( доступний у App Store ). Встановіть Growl та увімкніть "Оповіщення X X" (скріншот)

введіть тут опис зображення

Крім того, вам потрібно буде встановити GrowlNotify для інструменту командного рядка для надсилання сповіщень Growl. Ви можете завантажити цей інструмент безкоштовно на сторінці Завантажити .

Тепер ви можете генерувати сповіщення Growl з командного рядка, який буде переадресовано до Центру сповіщень. Наприклад:

growlnotify -n "My App" -m "Hello world"

введіть тут опис зображення

Зауважте, що наразі здається неможливим змінити значок програми.


1
Приємний підхід, особливо якщо вже встановлено гарчання.
Бесі

1
Я думаю, ви могли б використовувати параметр --icon path/to/icon.pngдля іконок.
Буде чи

Застарілий / більше не підтримується? Останнє оновлення було для macos 10.9 mavericks
Seamus

15

Нещодавно я розіслав термінал-сповіщувач створити інструмент командного рядка для відображення сповіщень про сповіщення (з діями) та відповідей типу сповіщень.

Я використовую це зі своїми скриптами оболонки та програмами golang, щоб отримувати інтерактивні відповіді від користувачів.

https://github.com/vjeantet/alerter

введіть тут опис зображення


1
Також очевидно застарілий / кинутий.
Seamus

15

@grgarside «s рішення добре, але він вразливий для ін'єкцій сценарію, який може бути серйозною проблемою безпеки , коли це використовується , щоб , наприклад , вміст файлу журналу дисплея або що - щось подібне.

Це повинно бути безпечнішим:

#!/bin/bash
X="$*" /usr/bin/osascript -e 'display notification system attribute "X"'

це цікаво, але чи можете ви описати сценарій, коли сценарій, який я запускаю у своїй системі, який працює лише користувачем, вразливий до введення скрипта?
іконоборство

1
Якщо ви показуєте вміст користувача, який не від вас, ви вразливі. Наприклад, якщо ви запускаєте це в системі із загальнодоступним веб-сервером, або коли деякі програми записують рядки, вони отримані з мережі, яку ви читаєте та відображаєте, наприклад, браузер, поштова програма або клієнт Twitter. Це може бути "до кінця рядка і твердження, тобто код , а потім перезапустити рядок.
Archimedix

добре, це правда. мені просто важко уявити, як колись розміщувати вміст із веб-форм у мої сповіщення, але ваша думка взята.
іконоборство

1
Ну, можливо, ви просто хочете сказати щось на кшталт, I have a "laser"не повідомляючи, що маєте синтаксичну помилку, "цитуючи" свої "слова". Втікаючи, ви можете:script 'I have a "laser"'
Архімедіс

1
Оновлення, тому що завжди добре пам’ятати про безпеку. Хтось міг скопіювати рішення з пасти та використати їх у спосіб, коли особа, яка розмістила рішення, не розглядала.
Едвард Фолк

13

Оскільки Growl не безкоштовний, а термінальний сповіщувач недоступний у системах до 10.8, я схильний використовувати cocoaDialog . Це безкоштовний та відкритий код, тому ви, ймовірно, також можете розповсюджувати разом зі своїми сценаріями.

Якщо вам не потрібна велика кількість налаштувань, ви також можете використовувати AppleScript, display notificationякі ви також можете викликати з оболонки, як уже згадували інші.

Але майте на увазі, що AppleScript, здається, вимагає подвійних лапок. Тож якщо вам потрібні змінні, це не спрацює :

osascript -e "display notification '$text' with title '$title'" #WRONG

Вам доведеться використовувати униклі подвійні лапки. Це некрасиво, але працює :

osascript -e "display notification \"$text\" with title \"$title\""

Це також працює:osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
MikeSchinkel

Також застаріло. Посилання посилається "Тут немає сайту GitHub Pages".
Seamus

11

(Це альтернативна реалізація, заснована на чудовій відповіді @ grgarside.)

AppleScript можна інтерпретувати безпосередньо, osascriptдодавши рядок shebang.

#!/usr/bin/osascript

on run argv
    if length of argv = 1 then
        display notification (item 1 of argv) with title "Notification"
    else if length of argv > 1 then
        display notification (item 1 of argv) with title (item 2 of argv)
    else
        return "<message> is required\nUsage: notify <message> [<title>]"
    end if
end run

Збережіть це як- notifyнебудь на своєму шляху, наприклад /usr/local/bin/notify, і зробіть його виконуваним ( chmod +x notify). Він приймає повідомлення та необов’язковий заголовок. Якщо будь-який має пробіл, оберніть його в лапки, щоб оболонка інтерпретувала його як єдиний аргумент.

$ notify "Lorem ipsum dolor sit amet" "Testing Notifications"

Це дозволяє уникнути нападів на ін'єкції, до яких вразливі всі інші відповіді
Ніл Мейхью,

7

Ось класний, який я використовую в рубіновому скрипті на OS X (так що я можу запустити скрипт і отримати оновлення навіть після переходу з вікна):

cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )

2
вау ... так що ланцюжок є чимось на зразок Користувача -> Ruby -> Shell -> AppleScript -> Objective-C -> Assembly -> CPU?
іконоборство

5

Альтернатива:

В .bash_profile:

function _sys_notify() {
    local notification_command="display notification \"$2\" with title \"$1\""
    osascript -e "$notification_command"
}
alias sys-notify="_sys_notify $1 $2"

Використовувати команду: sys-notify "title" "message"


5

Офіційна документація

https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/DisplayNotifications.html

Скопіюйте текст сюди, якщо документ переміщено чи видалено.

Щоб показати сповіщення, надайте команді відображення сповіщення рядок для відображення. Необов’язково вказуйте значення для параметрів заголовка, підзаголовка та звукового імені, щоб забезпечити додаткову інформацію та звукове сповіщення, коли з’явиться повідомлення

display notification "All graphics have been converted." with title "My Graphic Processing Script" subtitle "Processing is complete." sound name "Frog"

ПРИМІТКА

Після використання сценарію для відображення сповіщення сценарій або Редактор сценаріїв (якщо сценарій запускається з редактора сценаріїв) додається до списку програм сповіщень у розділі Налаштування системи> Сповіщення. Там ви можете налаштувати параметри, наприклад, відображати сповіщення як сповіщення чи банери.

Натиснувши кнопку Показати у сповіщенні у стилі оповіщення, відкриється програма, яка відображала сповіщення. Для сценарію додаток відкриття програми знову запускає обробник сценарію, що потенційно змушує сценарій починати обробку вдруге. Майте це на увазі та додайте код до свого сценарію, щоб обробити цей сценарій, якщо це доречно.


1

Дякую, це було саме те, що мені було потрібно для деяких сценаріїв користувачів. Я зробив невелику модифікацію, щоб додати підзаголовки та звук. Якщо значення не надається, воно ігнорується.

function _sys_notify() {
local notification_command="display notification \"$2\" with title \"$1\" subtitle \"$3\" sound name \"$4\""
osascript -e "$notification_command"
}

alias sys-notify="_sys_notify $1 $2 $3 $4"

Для звуку використовуйте назву звукового файла без розширення з / Система / Бібліотека / Звуки. Наприклад, щоб використовувати файл Ping.aiff, використовуйте Ping за $ 4

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.