Wie kann ich eine Notification Center-Benachrichtigung über ein AppleScript- oder Shell-Skript auslösen?

305

Ich würde gerne die Notification Center-Funktionen von 10.8 in AppleScripts und Shell-Skripten nutzen, die ich schreibe.

Gibt es einen eingebauten Befehl oder eine Drittanbieter-Bibliothek, die ich entweder über ein AppleScript- oder ein Shell-Skript verwenden kann?

Im Idealfall könnten Art und Symbol der Benachrichtigung gesteuert werden, aber auch nur die Möglichkeit, ein einfaches Banner mit einem Aktiensymbol (aber benutzerdefiniertem Text) auszulösen, wäre wünschenswert.

Nathan Greenstein
quelle

Antworten:

428

Mit Mavericks und höher können Sie dies mithilfe der AppleScript-Anzeigebenachrichtigung tun:

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

                          

Das war's - buchstäblich so einfach! Keine 3 rd -Party Bibliotheken oder Anwendungen erforderlich und ist vollständig portabel für den Einsatz auf anderen Systemen. 10.9 Benachrichtigung oben, 10.10 DP in der Mitte, 10.10 unten.

AppleScript kann von der Shell aus mit / usr / bin / osascript ausgeführt werden:

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

Sie können die Warnung auch weiter anpassen, indem Sie ... hinzufügen.

  • ein Untertitel

    Fügen Sie "Untertitel" hinzu, gefolgt von der Zeichenfolge oder Variablen, die den Untertitel enthält.

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

    Das obige Beispiel erzeugt die folgende Benachrichtigung:

  • Klang

    Fügen Sie 'Soundname' hinzu, gefolgt vom Namen eines Sounds, der zusammen mit der Benachrichtigung abgespielt wird.

    display notification "message" sound name "Sound Name"

    Gültige Soundnamen sind die Namen von Sounds, die sich in ... befinden.

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

Veröffentlichungsbenachrichtigungen können als Befehlszeilenskript umbrochen werden. Der folgende Code kann in Terminal ausgeführt werden und fügt ein Skript zu / usr / local / bin (muss vorhanden sein, zu $ ​​PATH hinzufügen) hinzu, das aufgerufen wird notify.

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

Dies ist das Skript, das oben zur Benachrichtigung hinzugefügt wird.

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

So zeigen Sie eine Benachrichtigung an:

notify Lorem ipsum dolor sit amet
sleep 5; notify Slow command finished
grg
quelle
9
@ceilingcat Dies ist AppleScript. Verwenden Sie zum Ausführen in Terminal Javascript (siehe Antwort).
grg
8
Das einzige Problem dabei display notificationist, dass beim Klicken darauf das Dialogfeld zum Öffnen der Datei angezeigt wird.
ɹoƃı
7
Ist es möglich, dass das Benachrichtigungs-Popup für immer existiert (nicht automatisch nach N Sekunden ausgeblendet), bis der Benutzer explizit darauf klickt?
Sridhar Ratnakumar
25
Meine Damen und Herren, nach einer Stunde Recherche im Internet habe ich herausgefunden, wie das Benachrichtigungsfenster so lange bestehen bleibt, bis es vom Benutzer entlassen wird! Es wurde tatsächlich durch eine Einstellung in der Systemeinstellung gesteuert und nicht durch einen Parameter im geschriebenen Skript. Diese beiden Bilder sollten sie alle erklären i.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg Viel Spaß Jungs und dank @grgarside für die große Antwort.
Vic Jang
4
Beachten Sie, dass der Text in doppelten Anführungszeichen stehen muss. Einfache Anführungszeichen funktionieren nicht. Also , wenn Sie eine Variable im Text benötigen, können Sie nicht schreiben "display ... '$mytext' ...", müssen aber entkam doppelte Anführungszeichen: "display notification \"$mytext\" ...".
Mivk
93

Terminal-Notifier

Aus der README:

terminal-notifier ist ein Befehlszeilentool zum Senden von Mac OS X-Benutzerbenachrichtigungen, die in Mac OS X 10.8 verfügbar sind.

Es wird derzeit als Anwendungspaket gepackt, da NSUserNotificationes nicht mit einem 'Foundation-Tool' funktioniert. Radar: // 11956694

Dieses Tool wird von Kicker verwendet , um den Status von Befehlen anzuzeigen, die aufgrund von Dateisystemänderungen ausgeführt werden. (v3.0.0)

Herunterladen

Vorkonfigurierte Binärdateien, die mit Code signiert und einsatzbereit sind, stehen im Download-Bereich zur Verfügung .

Verwendungszweck

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

Um Terminal-Notifier verwenden zu können, müssen Sie die Binärdatei im App-Bundle aufrufen .

Das erste Argument gibt die 'Gruppe' an, zu der eine Benachrichtigung gehört. Für jede Gruppe wird immer nur eine Benachrichtigung angezeigt, die zuvor veröffentlichte Benachrichtigungen ersetzt. Beispiele sind: die Prozess-ID des Absenders, um die Benachrichtigungen durch einen eindeutigen Prozess zu erfassen, oder das aktuelle Arbeitsverzeichnis, um Benachrichtigungen durch ein Projekt zu erfassen.

Das zweite und dritte Argument beschreiben die Benachrichtigung selbst und sind ihr "Titel" bzw. "Nachricht". Um dem Benutzer beispielsweise den Absender einer Benachrichtigung mitzuteilen, können Sie den Namen des Absenders als Titel angeben.

Das vierte und letzte Argument ist optional. Es gibt an, welche Anwendung aktiviert werden soll, wenn der Benutzer auf die Benachrichtigung klickt. Standardmäßig wird Terminal.app aktiviert, um eine andere Anwendung zu starten. Geben Sie stattdessen die Paket-ID der Anwendung an. Zum Beispiel Safari.app Gebrauch zu starten: com.apple.Safari.

Steve Moser
quelle
Süß, eine tolle Bibliothek! Würde gerne sehen, wie es mit der Kontrolle über das Symbol und Alarm gegen Banner aktualisiert wird, aber auf jeden Fall nützlich. Danke für den Link! i.imgur.com/tsCeK.png
Nathan Greenstein
2
Tolle kleine App, ich habe einen Launcher erstellt und in / usr / local / bin eingefügt, damit ich ihn überall von einem Terminal aus verwenden kann. Launcher-Skript: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/ MacOS ./terminal-notifier $ *
Johanandren
4
Launcher ist hilfreich, wenn Sie es ein wenig ändern, funktioniert es mit zitiertem Text mit Leerzeichen: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard
27

Ich möchte @ grgarsides Antwort nur eine Notiz hinzufügen, da ich weiß, dass viele Leute ein Benachrichtigungs-Popup haben möchten, das nur durch Klicken auf die Schaltfläche geschlossen werden kann.

Vergleich

Ich habe die Lösung für Sie gefunden:

Es wurde tatsächlich durch eine Einstellung in der Systemeinstellung gesteuert und nicht durch einen Parameter im geschriebenen Skript. Diese beiden Bilder sollten alles erklären

Danke @grgarside für die tolle Antwort.

Systemeinstellung

Vic Jang
quelle
5
Beachten Sie, dass die spezifische App variieren wird. Script Editorist nur für Script Editor.appund osascript. In einem Service-Workflow ist es Automator Runner. Wenn drinnen Automator.app, ist es Automator.
22.
1
Ich finde es ärgerlich, wenn ich auf das Banner klicke, wird die Skript-Editor-Anwendung aufgerufen. Ich möchte, dass es nur durch Klicken verschwindet, aber in diesem Beitrag wird darauf hingewiesen, dass Sie mit dem Mauszeiger
Joshua Goldberg
@ JoshuaGoldberg Vielen Dank für das Hinzufügen! Ich habe das eines Tages intuitiv herausgefunden, was ich an Mac OS X sehr mag. Es funktioniert so, wie man es erwartet :)
Vic Jang
22

Sie können dies jetzt mit Growl2 ( im App Store erhältlich ) tun . Installiere Growl und aktiviere "OS X Notifications" (Screenshot)

Bildbeschreibung hier eingeben

Darüber hinaus müssen Sie GrowlNotify installieren, damit ein Befehlszeilentool Growl-Benachrichtigungen senden kann. Sie können dieses Tool kostenlos auf der Download-Seite herunterladen .

Sie können jetzt Growl-Benachrichtigungen über die Befehlszeile generieren, die an das Notification Center weitergeleitet werden. Zum Beispiel:

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

Bildbeschreibung hier eingeben

Beachten Sie, dass das Anwendungssymbol derzeit nicht geändert werden kann.

Gerry
quelle
1
Netter Ansatz, besonders wenn Growl bereits installiert ist.
Besi
1
Ich denke, Sie könnten die Option --icon path/to/icon.pngfür Symbole verwenden.
Will
Veraltet / nicht mehr gewartet? Letztes Update war für MacOS 10.9 Mavericks
Seamus
15

Ich habe vor kurzem Terminal-Notifier angekündigt, um ein Befehlszeilen-Tool zum Anzeigen von Benachrichtigungs-Alerts (mit Aktionen) und Antworttyp-Alerts zu erstellen.

Ich benutze es mit meinen Shell-Skripten und Golang-Apps, um interaktive Antworten von Benutzern zu erhalten.

https://github.com/vjeantet/alerter

Bildbeschreibung hier eingeben

vjeantet
quelle
1
Auch anscheinend veraltet / aufgegeben.
Seamus
15

Die Lösung von @grgarside ist nett, aber anfällig für Skripteinspritzung , was ein großes Sicherheitsproblem sein kann, wenn dies z. B. zum Anzeigen des Inhalts von Protokolldateien oder dergleichen verwendet wird.

Das sollte sicherer sein:

#!/bin/bash
X="$*" /usr/bin/osascript -e 'display notification system attribute "X"'
Archimedix
quelle
Das ist interessant, aber können Sie ein Szenario beschreiben, in dem ein Skript, das ich auf meinem System ausführe und das nur vom Benutzer ausführbar ist, anfällig für Skripteinspritzung ist?
Bilderstürmer
1
Wenn Sie Benutzerinhalte anzeigen, die nicht von Ihnen stammen, sind Sie anfällig. Wenn Sie dies beispielsweise auf einem System mit einem öffentlichen Webserver ausführen oder wenn einige App-Protokolle Zeichenfolgen aus dem von Ihnen gelesenen und angezeigten Netz abrufen, z. B. ein Browser, ein E-Mail-Programm oder ein Twitter-Client. Es könnte ein "haben, um die Zeichenfolge und die Anweisung zu beenden, dann Code zu haben und dann eine Zeichenfolge neu zu starten.
Archimedix
Okay, das stimmt. Es fällt mir nur schwer, mir vorzustellen, jemals Inhalte aus Webformularen in meine Benachrichtigungen aufzunehmen, aber Ihr Standpunkt ist klar.
Bilderstürmer
1
Nun, vielleicht möchten Sie einfach etwas sagen, I have a "laser"ohne dass Ihnen gesagt wird, dass Sie einen Syntaxfehler haben, indem Sie Ihre "Wörter" "zitieren". Mit der Flucht können Sie:script 'I have a "laser"'
Archimedix
1
Upvote, weil es immer gut ist, die Sicherheit im Auge zu behalten. Jemand konnte Pasta-Lösungen kopieren und auf eine Weise verwenden, die die Person, die die Lösung veröffentlicht hatte, nicht in Betracht gezogen hatte.
Edward Falk
13

Da Growl nicht kostenlos ist und Terminal-Notifier auf Systemen vor 10.8 nicht verfügbar ist, verwende ich in der Regel cocoaDialog . Es ist kostenlos und Open Source, sodass Sie es wahrscheinlich auch zusammen mit Ihren Skripten verteilen können.

Wenn Sie nicht viele Anpassungen benötigen, können Sie auch AppleScript verwenden, display notificationdie Sie auch von der Shell aus aufrufen können, wie andere bereits erwähnt haben.

Beachten Sie jedoch, dass AppleScript doppelte Anführungszeichen zu erfordern scheint. Wenn Sie also Variablen benötigen, funktioniert dies nicht :

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

Sie müssen Anführungszeichen verwenden. Das ist hässlich aber funktioniert :

osascript -e "display notification \"$text\" with title \"$title\""
mivk
quelle
Das funktioniert auch:osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
MikeSchinkel
Auch veraltet. Link ergibt "Hier gibt es keine GitHub Pages Seite."
Seamus
11

(Dies ist eine alternative Implementierung, die auf der hervorragenden Antwort von @ grgarside basiert.)

AppleScript kann direkt interpretiert werden, indem osascriptdie shebang-Zeile eingefügt wird.

#!/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

Speichern Sie dies beispielsweise notifyirgendwo in Ihrem Pfad /usr/local/bin/notifyund machen Sie es ausführbar ( chmod +x notify). Es akzeptiert eine Nachricht und einen optionalen Titel. Wenn eines der beiden Leerzeichen enthält, setzen Sie es in Anführungszeichen, damit die Shell es als einzelnes Argument interpretiert.

$ notify "Lorem ipsum dolor sit amet" "Testing Notifications"
Steve
quelle
Dies vermeidet die Injektionsattacken, für die alle anderen Antworten anfällig sind
Neil Mayhew
7

Hier ist eine coole, die ich in einem Ruby-Skript unter OS X verwende (damit ich ein Skript starten und ein Update erhalten kann, auch wenn ich vom Fenster weggeschaltet habe):

cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )
JayCrossler
quelle
2
wow ... also die Kette ist so etwas wie User -> Ruby -> Shell -> AppleScript -> Objective-C -> Assembly -> CPU?
Bilderstürmer
5

Eine Alternative:

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

Befehl verwenden: sys-notify "title" "message"

ronald8192
quelle
5

Offizielle Dokumentation

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

Kopieren Sie den Text hierher, falls das Dokument verschoben oder entfernt wird.

Geben Sie zum Anzeigen einer Benachrichtigung den Befehl display notification mit einer anzuzeigenden Zeichenfolge an. Geben Sie optional Werte für die Parameter mit Titel, Untertitel und Soundname an, um zusätzliche Informationen und eine akustische Warnung bereitzustellen, wenn die Benachrichtigung angezeigt wird

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

HINWEIS

Nachdem Sie ein Skript zum Anzeigen einer Benachrichtigung verwendet haben, wird das Skript oder der Skript-Editor (wenn das Skript im Skript-Editor ausgeführt wird) zur Liste der Benachrichtigungs-Apps unter Systemeinstellungen> Benachrichtigungen hinzugefügt. Dort können Sie Optionen konfigurieren, z. B. ob Benachrichtigungen als Warnungen oder Banner angezeigt werden sollen.

Wenn Sie in einer Benachrichtigung im Benachrichtigungsstil auf die Schaltfläche Anzeigen klicken, wird die App geöffnet, in der die Benachrichtigung angezeigt wird. Bei einer Skript-App löst das erneute Öffnen der App den Run-Handler des Skripts aus, wodurch das Skript möglicherweise ein zweites Mal ausgeführt wird. Denken Sie daran, und fügen Sie Ihrem Skript gegebenenfalls Code hinzu, um dieses Szenario zu handhaben.

nishanths
quelle
1

Vielen Dank, das war genau das, was ich für einige Benutzerskripte brauchte. Ich habe eine kleine Änderung vorgenommen, um Untertitel und Sound hinzuzufügen. Wird kein Wert angegeben, wird dieser ignoriert.

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"

Verwenden Sie für den Sound einen Sound-Dateinamen ohne die Erweiterung von / System / Library / Sounds. Um beispielsweise die Datei Ping.aiff zu verwenden, verwenden Sie Ping für 4 USD

Kevin Mason
quelle