Come posso attivare una notifica del Centro notifiche da uno script AppleScript o shell?


305

Mi piacerebbe poter sfruttare le funzionalità del Centro notifiche di 10.8 negli script Apple e negli script shell che scrivo.

Esiste un comando integrato o una libreria di terze parti che posso usare da uno script AppleScript o shell?

Idealmente, il tipo e l'icona della notifica potrebbero essere controllati, ma sarebbe gradita anche solo la possibilità di attivare un banner di base con un'icona di borsa (ma testo personalizzato).


Risposte:


428

Con Mavericks e versioni successive, puoi farlo utilizzando la "notifica di visualizzazione" di AppleScript:

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

                          

Tutto qui, letteralmente così semplice! No 3 ° librerie o applicazioni -party necessari ed è completamente portatile per l'utilizzo su altri sistemi. 10.9 notifica in alto, 10.10 DP in mezzo, 10.10 in basso.

AppleScript può essere eseguito dalla shell usando / usr / bin / osascript:

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

Puoi anche personalizzare ulteriormente l'avviso aggiungendo ...

  • un sottotitolo

    Aggiungi 'sottotitolo' seguito dalla stringa o variabile contenente il sottotitolo.

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

    L'esempio sopra produce la seguente notifica:

  • suono

    Aggiungi 'nome del suono' seguito dal nome di un suono che verrà riprodotto insieme alla notifica.

    display notification "message" sound name "Sound Name"

    I nomi dei suoni validi sono i nomi dei suoni situati in ...

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

La pubblicazione di notifiche può essere racchiusa come uno script da riga di comando. Il seguente codice può essere eseguito in Terminal e aggiungerà uno script a / usr / local / bin (deve esistere, aggiungere a $ PATH) chiamato notify.

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

Questo è lo script che verrà aggiunto in precedenza per notificare.

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

Ora per visualizzare una notifica:

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

9
@ceilingcat Questo è AppleScript. Per eseguirlo in Terminale, utilizzare JavaScript (vedi risposta).
GRG

8
L'unico problema display notificationè che quando si fa clic su di esso, viene visualizzata la finestra di dialogo Apri file.
Augoƃı,

7
È possibile far sì che il popup notificatiop esista per sempre (non si nasconda automaticamente dopo N secondi) fino a quando non viene cliccato esplicitamente dall'utente?
Sridhar Ratnakumar,

25
Onorevoli colleghi, dopo un'ora di indagini sul World Wide Web, ho scoperto come lasciare la finestra di notifica fino a quando non viene ignorata dall'utente! In realtà era controllato da un'impostazione in Preferenze di Sistema, piuttosto che da alcuni parametri nello script scritto. Queste due immagini dovrebbero spiegare tutto i.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg Divertiti ragazzi e grazie @grgarside per l'ottima risposta.
Vic Jang

4
Si noti che il testo deve essere tra virgolette doppie. Le virgolette singole non funzionano. Quindi, se avete bisogno di una variabile nel testo, non è possibile scrivere "display ... '$mytext' ...", ma necessità sfuggito virgolette doppie: "display notification \"$mytext\" ...".
mivk,

93

terminale-notifier

Dal README:

terminal-notifier è uno strumento da riga di comando per inviare notifiche utente per Mac OS X, che sono disponibili in Mac OS X 10.8.

Attualmente è impacchettato come un pacchetto di applicazioni, perché NSUserNotificationnon funziona da uno "strumento di base". radar: // 11956694

Questo strumento verrà utilizzato da Kicker per mostrare lo stato dei comandi eseguiti a causa di modifiche al filesystem. (v3.0.0)

Scaricare

I binari predefiniti, che sono firmati in codice e pronti per l'uso, sono disponibili nella sezione download .

uso

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

Per utilizzare Terminal-Notifier, devi chiamare il binario all'interno del bundle dell'app.

Il primo argomento specifica il "gruppo" a cui appartiene una notifica. Per ogni "gruppo" verrà mai mostrata una sola notifica, sostituendo le notifiche precedentemente pubblicate. Esempi sono: l'ID del processo del mittente per l'ambito delle notifiche mediante un processo univoco o la directory di lavoro corrente per le notifiche dell'ambito di un progetto.

Il secondo e il terzo argomento descrivono la notifica stessa e sono rispettivamente il suo "titolo" e "messaggio". Ad esempio, per comunicare all'utente il mittente di una notifica, è possibile specificare il nome del mittente come titolo.

Il quarto e ultimo argomento è facoltativo. Specifica quale applicazione deve essere attivata quando l'utente fa clic sulla notifica. Per impostazione predefinita, questo attiverà Terminal.app, per avviare un'altra applicazione invece specificare l'identificatore del bundle dell'applicazione. Ad esempio, per lanciare l'uso Safari.app: com.apple.Safari.


Dolce, una grande biblioteca! Mi piacerebbe vederlo aggiornato con il controllo dell'icona e avviso vs banner, ma sicuramente utile. Grazie per il link! i.imgur.com/tsCeK.png
Nathan Greenstein,

2
Grande piccola app, ho creato un launcher e messo in / usr / local / bin in modo da poterlo usare ovunque da un terminale ecc. Script di avvio: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/ MacOS ./terminal-notifier $ *
johanandren il

4
Launcher è utile, se lo cambi un po 'funziona con il testo tra virgolette con spazi: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard

27

Voglio solo aggiungere una nota alla risposta di @ grgarside, perché so che molte persone vogliono avere un popup di notifica che può essere ignorato solo facendo clic sul pulsante.

Confronto

Ho trovato la soluzione per te:

In realtà era controllato da un'impostazione in Preferenze di Sistema, piuttosto che da alcuni parametri nello script scritto. Queste due immagini dovrebbero spiegare tutto

Grazie @grgarside per l'ottima risposta.

Preferenza di sistema


5
Nota che l'app specifica varierà. Script Editorè solo per Script Editor.appe osascript. In un flusso di lavoro di servizio, lo è Automator Runner. Quando dentro Automator.app, lo è Automator.
cde

1
Trovo fastidioso che se faccio clic sul banner, visualizzi l'applicazione Script Editor. Mi piacerebbe che scompaia semplicemente con un clic, ma questo post sottolinea che puoi passarci sopra con il mouse e scorrere con il trackpad a destra per farlo scomparire tranquillamente: osxdaily.com/2012/09/05/…
Joshua Goldberg

@JoshuaGoldberg Grazie per averlo aggiunto! L'ho scoperto in modo intuitivo un giorno, che è una cosa che mi piace di Mac OS X, funziona come pensi che funzioni :)
Vic Jang

22

Ora puoi farlo con Growl2 ( disponibile su App Store ). Installa Growl e abilita "Notifiche OS X" (screenshot)

inserisci qui la descrizione dell'immagine

Inoltre, dovrai installare GrowlNotify per uno strumento da riga di comando per inviare notifiche Growl. Puoi scaricare questo strumento gratuitamente nella pagina di download .

Ora puoi generare notifiche Growl dalla riga di comando, che verrà inoltrata al Centro notifiche. Per esempio:

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

inserisci qui la descrizione dell'immagine

Si noti che al momento non sembra possibile modificare l'icona dell'applicazione.


1
Un approccio gradevole soprattutto se il ringhio è già installato.
Besi,

1
Penso che potresti essere in grado di utilizzare l'opzione --icon path/to/icon.pngper le icone.
Sarà il

Obsoleto / non più mantenuto? L'ultimo aggiornamento è stato per macos 10.9 mavericks
Seamus l'

15

Recentemente ho creato un avviso terminale per creare uno strumento da riga di comando per visualizzare gli avvisi di notifica (con azioni) e gli avvisi sul tipo di risposta.

Lo uso con i miei script shell e le app golang per ottenere risposte interattive dagli utenti.

https://github.com/vjeantet/alerter

inserisci qui la descrizione dell'immagine


1
Apparentemente anche deprecato / abbandonato.
Seamus,

15

La soluzione di @grgarside è buona, ma è vulnerabile all'iniezione di script, che può essere un grosso problema di sicurezza quando viene utilizzata, ad esempio, per visualizzare il contenuto del file di registro o qualcosa di simile.

Questo dovrebbe essere più sicuro:

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

questo è interessante, ma puoi descrivere uno scenario in cui uno script che eseguo sul mio sistema che è solo eseguibile dall'utente è vulnerabile all'iniezione di script?
iconoclasta il

1
Se visualizzi contenuti utente che non provengono da te, sei vulnerabile. Ad esempio, se lo esegui su un sistema con un server Web pubblico o quando alcune app registrano le stringhe ottenute dalla rete che leggi e visualizzi, ad esempio un browser, un programma di posta o un client Twitter. Potrebbe avere un "per terminare la stringa e l'istruzione, quindi avere il codice e quindi riavviare una stringa.
Archimedix

ok, è vero. è difficile per me immaginare di inserire contenuti nelle forme Web nelle mie notifiche, ma il tuo punto è preso.
iconoclasta il

1
Bene, forse ti piacerebbe solo dire qualcosa del genere I have a "laser"senza che ti venga detto che stai riscontrando un errore di sintassi "citando" le tue "parole". Con la fuga, puoi:script 'I have a "laser"'
Archimedix il

1
Valuta perché è sempre bene tenere a mente la sicurezza. Qualcuno potrebbe copiare le soluzioni di pasta e usarle in modi che la persona che pubblicava la soluzione non aveva preso in considerazione.
Edward Falk,

13

Poiché Growl non è gratuito e Terminal-Notifier non è disponibile sui sistemi precedenti alla 10.8, tendo a utilizzare cocoaDialog . È gratuito e open source, quindi probabilmente puoi anche distribuire insieme ai tuoi script.

Se non hai bisogno di molta personalizzazione, puoi anche usare AppleScript display notificationche puoi anche chiamare dalla shell come altri hanno già detto.

Ma attenzione che AppleScript sembra richiedere virgolette. Quindi, se hai bisogno di variabili, questo non funzionerà :

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

Dovrai usare le virgolette doppie con escape. Questo è brutto ma funziona :

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

Questo funziona anche:osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
MikeSchinkel,

Anche deprecato. Link restituisce "Non esiste un sito GitHub Pagine qui."
Seamus,

11

(Questa è un'implementazione alternativa basata sull'ottima risposta di @ grgarside.)

AppleScript può essere interpretato direttamente inserendo osascriptla riga 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

Salvalo come notifyda qualche parte nel tuo percorso, ad esempio /usr/local/bin/notify, e rendilo eseguibile ( chmod +x notify). Accetta un messaggio e un titolo opzionale. Se uno dei due ha spazi bianchi, racchiudilo tra virgolette in modo che la shell lo interpreti come un singolo argomento.

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

Questo evita gli attacchi di iniezione a cui tutte le altre risposte sono vulnerabili
Neil Mayhew,

7

Eccone uno interessante che utilizzo in uno script ruby ​​su OS X (in modo da poter avviare uno script e ottenere un aggiornamento anche dopo essere passato dalla finestra):

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

2
wow ... quindi la catena è qualcosa come User -> Ruby -> Shell -> AppleScript -> Objective-C -> Assembly -> CPU?
iconoclasta il

5

Un'alternativa:

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"

Usa il comando: sys-notify "title" "message"


5

Documentazione ufficiale

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

Copia del testo qui, nel caso in cui il documento venga spostato o rimosso.

Per mostrare una notifica, fornire al comando display notification una stringa da visualizzare. Facoltativamente, fornire i valori per i parametri con titolo, sottotitolo e nome audio per fornire ulteriori informazioni e un avviso acustico quando viene visualizzata la notifica

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

NOTA

Dopo aver utilizzato uno script per visualizzare una notifica, lo script o l'Editor di script (se lo script viene eseguito all'interno dell'Editor di script) viene aggiunto all'elenco delle app di notifica in Preferenze di Sistema> Notifiche. Qui puoi configurare le opzioni, ad esempio se visualizzare notifiche come avvisi o banner.

Facendo clic sul pulsante Mostra in una notifica in stile avviso si apre l'app che ha visualizzato la notifica. Per un'app di script, l'azione di apertura dell'app innesca nuovamente il gestore di esecuzione dello script, causando potenzialmente lo script una seconda volta. Tienilo a mente e aggiungi il codice al tuo script per gestire questo scenario, se appropriato.


1

Grazie, questo era proprio quello di cui avevo bisogno per alcuni script utente. Ho apportato una leggera modifica per aggiungere un sottotitolo e un suono. Se un valore non viene fornito, viene ignorato.

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"

Per l'audio, utilizzare un nome file audio senza l'estensione da / Sistema / Libreria / Suoni. Ad esempio, per utilizzare il file Ping.aiff, utilizzare Ping per $ 4

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.