Comment déclencher une notification Notification Center à partir d'un script AppleScript ou shell?

305

J'aimerais pouvoir tirer parti des fonctionnalités de Notification Center de 10.8 dans les scripts AppleScript et les scripts shell que j'écris.

Existe-t-il une commande intégrée ou une bibliothèque tierce utilisable à partir d'un script AppleScript ou shell?

Idéalement, le type et l'icône de la notification pourraient être contrôlés, mais même la possibilité de déclencher une bannière de base avec une icône de stock (mais un texte personnalisé) serait appréciée.

Nathan Greenstein
la source

Réponses:

428

Avec Mavericks et les versions ultérieures, vous pouvez utiliser la "notification d'affichage" d'AppleScript:

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

                          

C'est ça - littéralement si simple! Aucun 3 e bibliothèques -Party ou les applications nécessaires et est entièrement portable pour une utilisation sur d' autres systèmes. 10.9 notification en haut, 10.10 DP au milieu, 10.10 en bas.

AppleScript peut être exécuté à partir du shell en utilisant / usr / bin / osascript:

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

Vous pouvez également personnaliser davantage l'alerte en ajoutant…

  • un sous-titre

    Ajoutez 'sous-titre' suivi de la chaîne ou de la variable contenant le sous-titre.

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

    L'exemple ci-dessus génère la notification suivante:

  • du son

    Ajoutez 'nom du son' suivi du nom du son qui sera joué avec la notification.

    display notification "message" sound name "Sound Name"

    Les noms de sons valides sont les noms de sons situés dans…

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

Les notifications de publication peuvent être encapsulées dans un script de ligne de commande. Le code suivant peut être exécuté dans Terminal et ajoutera un script à / usr / local / bin (doit exister, ajouter à $ PATH) appelé notify.

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

C'est le script que les personnes ci-dessus vont ajouter pour notifier.

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

Maintenant pour afficher une notification:

notify Lorem ipsum dolor sit amet
sleep 5; notify Slow command finished
grg
la source
9
@ceilingcat Ceci est AppleScript. Pour l'exécuter dans Terminal, utilisez osascript (voir la réponse).
grg
8
Le seul problème avec, display notificationc'est que lorsque vous cliquez dessus, la boîte de dialogue d'ouverture de fichier apparaît.
oƃı
7
Est-il possible de faire en sorte que le popup de notification existe indéfiniment (ne se cache pas automatiquement après N secondes) jusqu'à ce que l'utilisateur clique explicitement sur lui?
Sridhar Ratnakumar
25
Mesdames et Messieurs, après une heure d’enquête sur le World Wide Web, j’ai découvert comment laisser la fenêtre de notification rester en place jusqu’à ce que l’utilisateur l’abandonne! En réalité, il était contrôlé par un paramètre défini dans les préférences système plutôt que par un paramètre du script écrit. Ces deux images doivent expliquer tout i.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg Demandez aux gars amusant, et merci @grgarside pour la grande réponse.
Vic Jang
4
Notez que le texte doit être entre guillemets. Les guillemets simples ne fonctionnent pas. Donc , si vous avez besoin d' une variable dans le texte, vous ne pouvez pas écrire "display ... '$mytext' ...", mais qui ont besoin échappé des guillemets doubles: "display notification \"$mytext\" ...".
mardi
93

notificateur de terminal

Du README:

terminal-notifier est un outil de ligne de commande permettant d'envoyer des notifications d'utilisateur Mac OS X, disponibles sous Mac OS X 10.8.

Il est actuellement packagé en tant qu’application car NSUserNotificationil ne fonctionne pas à partir d’un «outil de base». radar: // 11956694

Kicker utilisera cet outil pour afficher l’état des commandes exécutées en raison de modifications du système de fichiers. (v3.0.0)

Télécharger

Les fichiers binaires prédéfinis, signés en code et prêts à être utilisés, sont disponibles dans la section des téléchargements .

Usage

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

Pour utiliser terminal-notifier, vous devez appeler le binaire à l' intérieur du bundle d'applications.

Le premier argument spécifie le «groupe» auquel une notification appartient. Pour tout groupe, une seule notification sera affichée, remplaçant les notifications précédemment publiées. Les exemples sont: l'ID de processus de l'expéditeur pour étendre les notifications par un processus unique, ou le répertoire de travail actuel pour étendre les notifications par un projet.

Les deuxième et troisième arguments décrivent la notification elle-même et correspondent respectivement à son titre et à son message. Par exemple, pour communiquer l'expéditeur d'une notification à l'utilisateur, vous pouvez spécifier le nom de l'expéditeur comme titre.

Le quatrième et dernier argument est optionnel. Il spécifie quelle application doit être activée lorsque l'utilisateur clique sur la notification. Par défaut, cela activera Terminal.app. Pour lancer une autre application, indiquez plutôt l'identifiant de l'ensemble de l'application. Par exemple, pour lancer l' utilisation Safari.app: com.apple.Safari.

Steve Moser
la source
Doux, une super bibliothèque! J'adorerais la voir mise à jour avec le contrôle de l'icône et de la bannière d'alerte vs, mais certainement utile. Merci pour le lien! i.imgur.com/tsCeK.png
Nathan Greenstein
2
Super petite application, j'ai créé un lanceur et mis dans / usr / local / bin pour pouvoir l'utiliser n'importe où depuis un terminal, etc. Script de lancement: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/ MacOS ./notifier $ * *
johanandren
4
Le lanceur est utile, si vous le changez un peu, cela fonctionnera avec des guillemets et des espaces: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard
27

Je veux juste ajouter une note à la réponse de @ grgarside, car je sais que beaucoup de gens veulent avoir une notification contextuelle qui ne peut être rejetée que par un clic de bouton.

Comparaison

J'ai trouvé la solution pour vous:

En réalité, il était contrôlé par un paramètre défini dans les préférences système plutôt que par un paramètre du script écrit. Ces deux images devraient tout expliquer

Merci @grgarside pour la bonne réponse.

Préférence du système

Vic Jang
la source
5
Notez que l'application spécifique variera. Script Editorest seulement pour Script Editor.appet osascript. Dans un flux de travail de service, c'est Automator Runner. Quand à l'intérieur Automator.app, c'est Automator.
cde
1
Je trouve cela ennuyeux que si je clique sur la bannière, cela ouvre l'application Script Editor. J'aimerais que le message disparaisse au clic, mais cet article indique que vous pouvez le survoler et le trackpad-glisser à droite pour le faire disparaître tranquillement: osxdaily.com/2012/09/05/…
Joshua Goldberg
@JoshuaGoldberg Merci d'avoir ajouté cela! J'ai découvert cela intuitivement un jour, et c'est une chose que j'apprécie dans Mac OS X: tout fonctionne comme prévu.
Vic Jang
22

Vous pouvez maintenant le faire avec Growl2 ( disponible sur l'App Store ). Installer Growl et activer "Notifications OS X" (capture d'écran)

entrez la description de l'image ici

De plus, vous devez installer GrowlNotify pour un outil de ligne de commande permettant d'envoyer des notifications de Growl. Vous pouvez télécharger cet outil gratuitement sur la page de téléchargement .

Vous pouvez maintenant générer des notifications Growl à partir de la ligne de commande, qui seront transférées au Centre de notifications. Par exemple:

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

entrez la description de l'image ici

Notez qu'il ne semble pas possible actuellement de changer l'icône de l'application.

Gerry
la source
1
Belle approche surtout si growl est déjà installé.
Besi
1
Je pense que vous pourriez être en mesure d'utiliser l'option --icon path/to/icon.pngpour les icônes.
Will
Obsolète / n'est plus entretenu? Dernière mise à jour pour macos 10.9 mavericks
Seamus
15

J'ai récemment créé terminal-notifier pour créer un outil de ligne de commande permettant d'afficher des alertes de notification (avec des actions) et des alertes de type de réponse.

Je l'utilise avec mes scripts shell et mes applications golang pour obtenir des réponses interactives des utilisateurs.

https://github.com/vjeantet/alerter

entrez la description de l'image ici

vjeantet
la source
1
Aussi apparemment déconseillé / abandonné.
Seamus
15

La solution de @grgarside est bien, mais elle est vulnérable à l’injection de script, ce qui peut être un problème de sécurité majeur lorsque celle-ci est utilisée pour afficher par exemple le contenu du fichier journal ou quelque chose de similaire.

Cela devrait être plus sûr:

#!/bin/bash
X="$*" /usr/bin/osascript -e 'display notification system attribute "X"'
Archimedix
la source
c'est intéressant, mais pouvez-vous décrire un scénario dans lequel un script que je lance sur mon système et qui est uniquement exécutable par l'utilisateur est vulnérable à l'injection de script?
iconoclaste
1
Si vous affichez du contenu utilisateur qui ne provient pas de vous, vous êtes vulnérable. Par exemple, si vous exécutez ceci sur un système avec un serveur Web public, ou lorsque certaines applications enregistrent des chaînes provenant du réseau que vous lisez et affichez, par exemple un navigateur, un programme de messagerie ou un client Twitter. Il pourrait avoir un "pour terminer la chaîne et l'instruction, puis avoir le code et ensuite redémarrer une chaîne.
Archimedix
d'accord, c'est vrai. Il m'est difficile d'imaginer que les notifications contiennent des contenus de formulaires Web, mais votre argument est valable.
iconoclaste
1
Eh bien, vous aimeriez peut-être simplement dire quelque chose comme si I have a "laser"vous ne rencontriez pas d'erreur de syntaxe en "citant" vos "mots". Avec échapper, vous pouvez:script 'I have a "laser"'
Archimedix
1
Upvote parce qu'il est toujours bon de garder la sécurité à l'esprit. Quelqu'un pourrait copier les solutions de pâtes et les utiliser d'une manière que la personne qui publiait la solution n'avait pas envisagée.
Edward Falk
13

Puisque Growl n'est pas gratuit et que terminal-notifier n'est pas disponible sur les systèmes antérieurs à la version 10.8, j'ai tendance à utiliser cocoaDialog . C'est gratuit et open source, vous pouvez donc probablement le distribuer avec vos scripts.

Si vous n'avez pas besoin de beaucoup de personnalisation, vous pouvez également utiliser les scripts AppleScript display notificationque vous pouvez également appeler à partir du shell, comme d'autres l'ont déjà mentionné.

Mais attention, AppleScript semble nécessiter des guillemets doubles. Donc, si vous avez besoin de variables, cela ne fonctionnera pas :

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

Vous devrez utiliser des guillemets doubles. C'est moche mais ça marche :

osascript -e "display notification \"$text\" with title \"$title\""
mivk
la source
Cela fonctionne aussi:osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
MikeSchinkel
Aussi obsolète. Le lien indique "Il n'y a pas de site GitHub Pages ici."
Seamus
11

(Il s'agit d'une implémentation alternative basée sur l'excellente réponse de @ grgarside.)

AppleScript peut être interprété directement osascripten insérant la ligne 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

Enregistrez ceci en tant que notifyquelque part dans votre chemin, par exemple /usr/local/bin/notify, et rendez-le exécutable ( chmod +x notify). Il accepte un message et un titre optionnel. Si l'un d'entre eux a des espaces, placez-le entre guillemets afin que le shell l'interprète comme un argument unique.

$ notify "Lorem ipsum dolor sit amet" "Testing Notifications"
Steve
la source
Cela évite les attaques par injection auxquelles toutes les autres réponses sont vulnérables
Neil Mayhew
7

Voici un exemple intéressant que j'utilise dans un script ruby ​​sous OS X (pour pouvoir démarrer un script et obtenir une mise à jour même après avoir quitté la fenêtre):

cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )
JayCrossler
la source
2
wow ... donc la chaîne ressemble à quelque chose comme User -> Ruby -> Shell -> AppleScript -> Objective-C -> Assembly -> CPU?
iconoclaste
5

Une alternative:

Dans .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"

Utilisez la commande: sys-notify "title" "message"

ronald8192
la source
5

Documentation officielle

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

Copier le texte ici, au cas où le document serait déplacé ou supprimé.

Pour afficher une notification, fournissez à la commande display notification une chaîne à afficher. En option, indiquez des valeurs pour les paramètres avec titre, sous-titre et nom du son afin de fournir des informations supplémentaires et une alerte sonore lorsque la notification apparaît.

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

REMARQUE

Après avoir utilisé un script pour afficher une notification, le script ou l'éditeur de script (si le script est exécuté à partir de l'éditeur de script) est ajouté à la liste des applications à notifier dans Préférences système> Notifications. Vous pouvez y configurer des options, telles que l’affichage des notifications sous forme d’alertes ou de bannières.

En cliquant sur le bouton Afficher dans une notification de type alerte, l'application qui a affiché la notification s'ouvre. Pour une application de script, l'action d'ouvrir à nouveau l'application déclenche le gestionnaire d'exécution du script, ce qui peut entraîner le traitement du script une seconde fois. N'oubliez pas cela et ajoutez du code à votre script pour gérer ce scénario, le cas échéant.

nishanths
la source
1

Merci, c’était exactement ce dont j’avais besoin pour quelques scripts d’utilisateur. J'ai fait une légère modification pour ajouter un sous-titre et un son. Si une valeur n'est pas fournie, elle est ignorée.

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"

Pour le son, utilisez un nom de fichier son sans l’extension de / System / Library / Sounds. Par exemple, pour utiliser le fichier Ping.aiff, utilisez Ping pour $ 4.

Kevin Mason
la source