Я хотел бы иметь возможность использовать преимущества Центра уведомлений 10.8 в сценариях AppleScript и сценариях оболочки, которые я пишу.
Есть ли встроенная команда или сторонняя библиотека, которую я могу использовать из сценария AppleScript или оболочки?
В идеале можно управлять типом и значком уведомления, но приветствуется даже возможность запуска базового баннера со стандартным значком (но настраиваемым текстом).
В Mavericks и более поздних версиях вы можете сделать это с помощью «отображения уведомления» AppleScript:
display notification "Lorem ipsum dolor sit amet" with title "Title"
Вот и все — буквально так просто! Никаких сторонних библиотек или приложений не требуется, и он полностью переносим для использования в других системах. Уведомление 10.9 сверху, 10.10 DP посередине, 10.10 снизу.
AppleScript можно запустить из оболочки с помощью /usr/bin/osascript:
osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
Вы также можете дополнительно настроить оповещение, добавив…
подзаголовок
Добавьте 'subtitle', а затем строку или переменную, содержащую подзаголовок.
display notification "message" with title "title" subtitle "subtitle"
В приведенном выше примере создается следующее уведомление:
звук
Добавьте «название звука», а затем название звука, который будет воспроизводиться вместе с уведомлением.
display notification "message" sound name "Sound Name"
Допустимые названия звуков — это названия звуков, расположенных в…
~/Library/Sounds
/System/Library/Sounds
Уведомления о публикации можно оформить как сценарий командной строки. Следующий код можно запустить в Терминале, и он добавит скрипт в /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
display
? У меня есть Mavericks, но я не могу найти его. Спасибо!-bash: display: command not found
Мой путь довольно странный, поэтому было бы неплохо точно знать, где display
он находится.display notification
заключается в том, что при нажатии на нее появляется диалоговое окно открытия файла."display ... '$mytext' ..."
, но вам нужны экранированные двойные кавычки: "display notification \"$mytext\" ..."
.display notification
у меня не работает на El Capitan, хотя display alert
работает нормально. В документации утверждается, что оба работают. Любое понимание этого?sound name
больше не позволяет воспроизводить пользовательские звуки ~/Library/Sounds
. Кто-нибудь знает исправление? Использование macOS 10.13.2.zsh: command not found: display
Из README:
terminal-notifier — это инструмент командной строки для отправки уведомлений пользователей 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
.
sh: terminal-notifier: command not found
brew
каталог bin в переменной $PATH? По умолчанию не...Я просто хочу добавить примечание к ответу @grgarside, потому что я знаю, что многие люди хотят иметь всплывающее уведомление, которое можно закрыть только нажатием кнопки.
Я нашел решение для вас:
На самом деле это контролировалось настройкой в Системных настройках, а не каким-то параметром в написанном скрипте. Эти два изображения должны все объяснить
Спасибо @grgarside за отличный ответ.
Script Editor
только для Script Editor.app
и osascript
. В рабочем процессе службы это Automator Runner
. Когда внутри Automator.app
, это Automator
.osascript
команду внезапно перестала работать ни в iTerm, ни в терминале, пока я не зашел в настройки уведомлений для редактора сценариев и не изменил его с «Нет» на «Баннеры»!display notification
успешным запуском; иногда это работало, иногда просто молчало. После нескольких месяцев такого разочаровывающего поведения я наконец обнаружил, что это было вызвано режимом « Не беспокоить », который я планировал активировать после 8 вечера. 🤦♂️Теперь вы можете сделать это с помощью Growl2 ( доступно в App Store ). Установите Growl и включите «Уведомления OS X» (скриншот)
Кроме того, вам потребуется установить GrowlNotify для инструмента командной строки для отправки уведомлений Growl. Вы можете скачать этот инструмент бесплатно на странице загрузки .
Теперь вы можете создавать уведомления Growl из командной строки, которые будут перенаправлены в Центр уведомлений. Например:
growlnotify -n "My App" -m "Hello world"
Обратите внимание, что в настоящее время изменить значок приложения не представляется возможным.
--icon path/to/icon.png
для значков.Недавно я разветвил terminal-notifier, чтобы создать инструмент командной строки для отображения предупреждений об уведомлениях (с действиями) и предупреждений о типе ответа.
Я использую его со своими сценариями оболочки и приложениями golang, чтобы получать интерактивные ответы от пользователей.
Решение @grgarside хорошее , но оно уязвимо для внедрения скриптов, что может быть серьезной проблемой безопасности, когда оно используется, например, для отображения содержимого файла журнала или чего-то подобного.
Это должно быть безопаснее:
#!/bin/bash
X="$*" /usr/bin/osascript -e 'display notification system attribute "X"'
I have a "laser"
того, что у вас синтаксическая ошибка, «цитируя» ваши «слова». С помощью побега вы можете:script 'I have a "laser"'
(Это альтернативная реализация, основанная на отличном ответе @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"
Поскольку Growl не является бесплатным, а terminal-notifier недоступен в системах до версии 10.8, я предпочитаю использовать CocoDialog . Это бесплатно и с открытым исходным кодом, так что вы, вероятно, также можете распространять его вместе со своими скриптами.
Если вам не нужно много настроек, вы также можете использовать 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"'
Вот классный вариант, который я использую в ruby-скрипте на OS X (чтобы я мог запустить скрипт и получить обновление даже после переключения из окна):
cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )
В .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"
Официальная документация
Копируем сюда текст на случай, если документ будет перемещен или удален.
Чтобы отобразить уведомление, предоставьте команде отображения уведомления строку для отображения. При необходимости укажите значения для параметров with title, subtitle и sound name, чтобы предоставить дополнительную информацию и звуковой сигнал при появлении уведомления.
display notification "All graphics have been converted." with title "My Graphic Processing Script" subtitle "Processing is complete." sound name "Frog"
ПРИМЕЧАНИЕ
После использования сценария для отображения уведомления сценарий или редактор сценариев (если сценарий запускается из редактора сценариев) добавляется в список уведомляющих приложений в разделе «Системные настройки» > «Уведомления». Там вы можете настроить параметры, например, отображать ли уведомления в виде предупреждений или баннеров.
При нажатии кнопки «Показать» в уведомлении в виде предупреждения открывается приложение, в котором отображалось уведомление. Для приложения-скрипта действие повторного открытия приложения запускает обработчик запуска скрипта, что потенциально может привести к тому, что скрипт начнет обработку во второй раз. Имейте это в виду и добавьте в свой сценарий код для обработки этого сценария, если это необходимо.
Спасибо, это как раз то, что мне было нужно для некоторых пользовательских скриптов. Я сделал небольшую модификацию, добавив субтитры и звук. Если значение не указано, оно игнорируется.
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"
Для звука используйте имя звукового файла без расширения из /System/Library/Sounds. Например, чтобы использовать файл Ping.aiff, используйте Ping за 4 доллара.
Если вам нужны липкие уведомления (комментарий Вика Джанга, кажется, больше не работает, по крайней мере, в Big Sur), вот своего рода способ, используйте диалоговое окно вместо уведомления:
osascript -e 'display dialog "Lorem ipsum dolor sit amet" with title "Title"'
Таким образом, вы можете сделать один, display notification
а затем продолжить диалог.
Также оповещение делает липким.
$ brew install alerter
$ alerter -message "hi"
dialog
блокировку вашего терминала, запустив в фоновом режиме:osascript -e 'display dialog "Lorem ipsum dolor sit amet" with title "Title"' &
Пэт