Ich würde gerne die Funktionen des Benachrichtigungszentrums von 10.8 in AppleScripts und Shell-Skripts, die ich schreibe, nutzen können.
Gibt es einen integrierten Befehl oder eine Bibliothek eines Drittanbieters, die ich entweder aus einem AppleScript oder einem Shell-Skript verwenden kann?
Idealerweise könnten Typ und Symbol der Benachrichtigung gesteuert werden, aber auch nur die Möglichkeit, ein einfaches Banner mit einem Bestandssymbol (aber benutzerdefiniertem Text) auszulösen, wäre wünschenswert.
Mit Mavericks und höher können Sie dies mit AppleScripts „Anzeigebenachrichtigung“ tun:
display notification "Lorem ipsum dolor sit amet" with title "Title"
Das ist es – buchstäblich so einfach! Keine Bibliotheken oder Apps von Drittanbietern erforderlich und vollständig portabel für die Verwendung auf anderen Systemen . 10.9 Benachrichtigung oben, 10.10 DP in der Mitte, 10.10 unten.
AppleScript kann von der Shell 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
Hängen Sie „subtitle“ an, gefolgt von der Zeichenfolge oder Variable, die den Untertitel enthält.
display notification "message" with title "title" subtitle "subtitle"
Das obige Beispiel erzeugt die folgende Benachrichtigung:
Klang
Hängen Sie „Soundname“ an, 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 in …
~/Library/Sounds
/System/Library/Sounds
Posting-Benachrichtigungen können als Befehlszeilenskript verpackt werden. Der folgende Code kann in Terminal ausgeführt werden und fügt ein Skript mit dem Namen /usr/local/bin hinzu (muss vorhanden sein, zu $PATH hinzufügen) 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 \"$*\""
Jetzt eine Benachrichtigung anzeigen:
notify Lorem ipsum dolor sit amet
sleep 5; notify Slow command finished
display
? Ich habe Mavericks, aber ich kann es nicht sehen. Danke!-bash: display: command not found
My path is irgendwie verrückt, also wäre es schön zu wissen, wo sich genau display
befindet.display notification
dabei ist, dass beim Anklicken der Datei-Öffnen-Dialog erscheint."display ... '$mytext' ..."
, sondern doppelte Anführungszeichen mit Escapezeichen: "display notification \"$mytext\" ..."
.display notification
funktioniert bei mir nicht auf El Capitan, obwohl es display alert
gut funktioniert. Die Dokumentation behauptet, dass beide funktionieren. Irgendwelche Erkenntnisse dazu?sound name
können Sie keine benutzerdefinierten Sounds ~/Library/Sounds
mehr abspielen. Weiß jemand Abhilfe? Mit macOS 10.13.2.zsh: command not found: display
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 ist derzeit als Anwendungspaket verpackt, da
NSUserNotification
es nicht mit einem „Foundation Tool“ funktioniert. radar://11956694Dieses Tool wird von Kicker verwendet , um den Status von Befehlen anzuzeigen, die aufgrund von Dateisystemänderungen ausgeführt werden. (v3.0.0)
Download
Vorgefertigte Binärdateien, die Code-signiert und gebrauchsfertig sind, sind im Download-Bereich verfügbar .
Verwendung
$ ./terminal-notifier.app/Contents/MacOS/terminal-notifier group-ID sender-name message [bundle-ID]
Um Terminal-Notifier zu verwenden, 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 gepostete Benachrichtigungen ersetzt. Beispiele sind: die Prozess-ID des Absenders, um die Benachrichtigungen einem eindeutigen Prozess zuzuordnen, oder das aktuelle Arbeitsverzeichnis, um Benachrichtigungen einem Projekt zuzuordnen.
Das zweite und dritte Argument beschreiben die Benachrichtigung selbst und sind ihr „Titel“ bzw. ihre „Nachricht“. Um dem Benutzer beispielsweise den Absender einer Benachrichtigung mitzuteilen, könnten 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 dadurch Terminal.app aktiviert, um eine andere Anwendung zu starten, geben Sie stattdessen die Bundle-ID der Anwendung an. Um beispielsweise Safari.app zu starten, verwenden Sie:
com.apple.Safari
.
sh: terminal-notifier: command not found
brew
bin-Verzeichnis in der `$PATH-Variablen? Standardmäßig geht das nicht...Ich möchte der Antwort von @ grgarside nur eine Anmerkung 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.
Ich habe die Lösung für dich gefunden:
Es wurde tatsächlich durch eine Einstellung in den Systemeinstellungen gesteuert und nicht durch einen Parameter im geschriebenen Skript. Diese beiden Bilder sollten alles erklären
Danke @grgarside für die tolle Antwort.
Script Editor
ist nur für Script Editor.app
und osascript
. In einem Service-Workflow ist es Automator Runner
. Wenn es drinnen Automator.app
ist, ist es Automator
.osascript
Befehl zu verwenden, funktionierte plötzlich nicht, weder in iTerm noch im Terminal, bis ich zu den Benachrichtigungseinstellungen für den Skripteditor ging und ihn von „Keine“ auf „Banner“ änderte!display notification
erfolgreich zum Laufen zu bringen; Manchmal würde es funktionieren, manchmal würde es nur still sein. Nach Monaten dieses frustrierenden Verhaltens entdeckte ich schließlich, dass es durch „Nicht stören “ verursacht wurde , das ich nach 20 Uhr aktivieren wollte. 🤦♂️Sie können dies jetzt mit Growl2 ( erhältlich im App Store ) tun. Growl installieren und "OS X Benachrichtigungen" aktivieren (Screenshot)
Außerdem müssen Sie GrowlNotify für ein Befehlszeilentool installieren, um Growl-Benachrichtigungen zu senden. 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"
Beachten Sie, dass es derzeit anscheinend nicht möglich ist, das Anwendungssymbol zu ändern.
--icon path/to/icon.png
für Symbole verwenden.Ich habe kürzlich terminal-notifier gegabelt, um ein Befehlszeilentool zu erstellen, um Benachrichtigungswarnungen (mit Aktionen) und Antworttypwarnungen anzuzeigen.
Ich verwende es mit meinen Shell-Skripten und Golang-Apps, um interaktive Antworten von Benutzern zu erhalten.
Die Lösung von @grgarside ist nett, aber sie ist anfällig für Skriptinjektionen, was ein großes Sicherheitsproblem darstellen kann, wenn dies verwendet wird, um z. B. den Inhalt von Protokolldateien oder ähnliches anzuzeigen.
Das sollte sicherer sein:
#!/bin/bash
X="$*" /usr/bin/osascript -e 'display notification system attribute "X"'
I have a "laser"
ohne dass Ihnen gesagt wird, dass Sie einen Syntaxfehler haben, indem Sie Ihre „Wörter“ „zitieren“. Mit Escape können Sie:script 'I have a "laser"'
(Dies ist eine alternative Implementierung, die auf der hervorragenden Antwort von @grgarside basiert.)
AppleScript kann direkt interpretiert werden, indem osascript
die 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 notify
irgendwo in Ihrem Pfad, zB , /usr/local/bin/notify
und machen Sie es ausführbar ( chmod +x notify
). Es akzeptiert eine Nachricht und einen optionalen Titel. Wenn eines von ihnen Leerzeichen enthält, schließen Sie es in Anführungszeichen ein, damit die Shell es als ein einzelnes Argument interpretiert.
$ notify "Lorem ipsum dolor sit amet" "Testing Notifications"
Da Growl nicht kostenlos ist und Terminal-Notifier auf Systemen vor 10.8 nicht verfügbar ist, neige ich dazu, coconutDialog zu verwenden . 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 AppleScripts verwenden, display notification
die 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 doppelte Anführungszeichen mit Escapezeichen verwenden. Das ist hässlich , funktioniert aber :
osascript -e "display notification \"$text\" with title \"$title\""
osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
Hier ist ein cooles, das ich in einem Ruby-Skript unter OS X verwende (damit ich ein Skript starten und ein Update erhalten kann, auch nachdem ich das Fenster verlassen habe):
cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )
Im .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"
Offizielle Dokumentation
Kopieren Sie hier den Text, falls das Dokument verschoben oder entfernt wird.
Um eine Benachrichtigung anzuzeigen, geben Sie den Anzeigebenachrichtigungsbefehl mit einer anzuzeigenden Zeichenfolge an. Geben Sie optional Werte für die Parameter with title, subtitle und sound name an, um zusätzliche Informationen und einen akustischen Alarm 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 benachrichtigenden Apps in Systemeinstellungen > Benachrichtigungen hinzugefügt. Dort können Sie Optionen konfigurieren, z. B. ob Benachrichtigungen als Warnungen oder Banner angezeigt werden sollen.
Durch Klicken auf die Schaltfläche „Anzeigen“ in einer Benachrichtigung im Benachrichtigungsstil wird die App geöffnet, die die Benachrichtigung angezeigt hat. Bei einer Skript-App löst die Aktion des erneuten Öffnens der App den Run-Handler des Skripts aus, was möglicherweise dazu führt, dass das Skript ein zweites Mal mit der Verarbeitung beginnt. Denken Sie daran, und fügen Sie gegebenenfalls Code zu Ihrem Skript hinzu, um dieses Szenario zu handhaben.
Danke, das war genau das, was ich für einige Benutzerskripte brauchte. Ich habe eine leichte Änderung vorgenommen, um einen Untertitel und Ton hinzuzufügen. Wenn kein Wert angegeben wird, wird er 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 Sounddateinamen ohne die Erweiterung aus /System/Library/Sounds. Um beispielsweise die Datei Ping.aiff zu verwenden, verwenden Sie Ping für $4
Wenn Sie klebrige Benachrichtigungen wünschen (Vic Jangs Kommentar scheint zumindest in Big Sur nicht mehr zu funktionieren), verwenden Sie hier eine Art Dialog statt Benachrichtigung:
osascript -e 'display dialog "Lorem ipsum dolor sit amet" with title "Title"'
Sie könnten also einen machen display notification
und dann mit dem Dialog weitermachen.
Auch Alerter macht Sticky.
$ brew install alerter
$ alerter -message "hi"
dialog
Ihr Terminal blockiert wird, indem Sie im Hintergrund laufen:osascript -e 'display dialog "Lorem ipsum dolor sit amet" with title "Title"' &
Klopfen