¿Cómo puedo activar una notificación del Centro de notificaciones desde un script AppleScript o shell?

279

Me encantaría poder aprovechar las características del Centro de notificaciones de 10.8 en AppleScripts y los scripts de shell que escribo.

¿Existe un comando incorporado o una biblioteca de terceros que pueda usar desde AppleScript o shell script?

Lo ideal sería controlar el tipo y el ícono de la notificación, pero se agradecería incluso la capacidad de activar un banner básico con un ícono común (pero con texto personalizado).

    
pregunta Nathan Greenstein 25.07.2012 - 20:57

11 respuestas

396

Con Mavericks y versiones posteriores, puede hacerlo utilizando la "notificación de visualización" de AppleScript:

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

Eso es todo, ¡literalmente así de simple! No se requieren 3 rd -party bibliotecas o aplicaciones y es completamente portátil para usar en otros sistemas. 10.9 notificación en la parte superior, 10.10 DP en el medio, 10.10 en la parte inferior.

AppleScript puede ejecutarse desde el shell utilizando / usr / bin / osascript:

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

También puede personalizar la alerta añadiendo ...

  • un subtítulo

    Agregue 'subtítulo' seguido de la cadena o variable que contiene el subtítulo.

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

    El ejemplo anterior produce la siguiente notificación:

  • sonido

    Agregue el 'nombre del sonido' seguido del nombre de un sonido que se reproducirá junto con la notificación.

    display notification "message" sound name "Sound Name"
    

    Los nombres de sonido válidos son los nombres de los sonidos ubicados en ...

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

Las notificaciones de publicación se pueden envolver como una secuencia de comandos de línea de comandos. El siguiente código se puede ejecutar en la Terminal y agregará un script a / usr / local / bin (debe existir, agregarlo a $ PATH) llamado notify .

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

Este es el script que se agregará a la notificación anterior.

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

Ahora para mostrar una notificación:

notify Lorem ipsum dolor sit amet
sleep 5; notify Slow command finished
    
respondido por el grg 29.12.2013 - 14:46
84

notificador de terminal

Desde el README:

  

notificador de terminal es una herramienta de línea de comandos para enviar usuarios de Mac OS X   Notificaciones, que están disponibles en Mac OS X 10.8.

     

Actualmente está empaquetado como un paquete de aplicaciones, porque    NSUserNotification no funciona desde una 'herramienta de Fundación'.   radar: // 11956694

     

Esta herramienta será utilizada por Kicker para   Mostrar el estado de los comandos que se ejecutan debido al sistema de archivos.   cambios (v3.0.0)

     

Descargar

     

Los binarios precompilados, que están firmados por código y listos para usar, son   disponible en las descargas de   sección .

     

Uso

     

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

     

Para usar el notificador de terminal, debes llamar al binario    dentro del paquete de la aplicación.

     

El primer argumento especifica el "grupo" al que pertenece una notificación.   Para cualquier "grupo", solo se mostrará una notificación de una , reemplazando   Notificaciones previamente publicadas. Algunos ejemplos son: el ID del proceso del remitente   alcance las notificaciones por un proceso único, o el trabajo actual   Directorio a las notificaciones de alcance por un proyecto.

     

El segundo y tercer argumento describen la notificación en sí y   son su ‘título’ y ‘mensaje’ respectivamente. Por ejemplo, para   comunicar el remitente de una notificación al usuario, usted podría   especifique el nombre del remitente como título.

     

El cuarto y último argumento es opcional. Especifica cual   La aplicación debe activarse cuando el usuario haga clic en la notificación.   Por defecto esto activará Terminal.app, para lanzar otro   aplicación en lugar de especificar el identificador de paquete de la aplicación. por   por ejemplo, para iniciar Safari.app use: com.apple.Safari .

    
respondido por el Steve Moser 25.07.2012 - 22:19
22

Solo quiero agregar una nota a la respuesta de @grgarside, porque sé que muchas personas desean tener una ventana emergente de notificación que solo se puede descartar haciendo clic en el botón.

Heencontradolasoluciónparati:

EnrealidadestabacontroladoporunaconfiguraciónenPreferenciasdelsistema,enlugardealgúnparámetroenelscriptescrito.Estasdosimágenesdeberíanexplicarlotodo

Gracias@grgarsideporlagranrespuesta.

    
respondido por el Vic Jang 07.11.2015 - 01:36
21

Ahora puedes hacer esto con Growl2 ( disponible en App Store ) Instale Growl y habilite "Notificaciones de OS X" (captura de pantalla)

Además,deberáinstalarGrowlNotifyparaqueunaherramientadelíneadecomandosenvíenotificacionesdeGrowl.Puededescargarestaherramientadeformagratuitaenla página de descarga .

Ahora puede generar notificaciones de Growl desde la línea de comandos, que se reenviarán al Centro de notificaciones. Por ejemplo:

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

Tenga en cuenta que actualmente no parece posible cambiar el ícono de la aplicación.

    
respondido por el Gerry 20.09.2012 - 15:25
13

Recientemente bifurqué el notificador de terminal para crear una herramienta de línea de comandos para mostrar las alertas de notificación (con acciones) y las alertas de tipo de respuesta.

Lo uso con mis aplicaciones de shell scripts y Golang para obtener respuestas interactivas de los usuarios.

enlace

    
respondido por el vjeantet 24.12.2015 - 16:29
12

@grgarside 's a solution es agradable, pero es vulnerable a la inyección de scripts, lo que puede ser un problema de seguridad importante cuando se usa, por ejemplo, mostrar el contenido del archivo de registro o algo similar.

Esto debería ser más seguro:

#!/bin/bash
X="$*" /usr/bin/osascript -e 'display notification system attribute "X"'
    
respondido por el Archimedix 14.05.2015 - 14:23
10

Dado que Growl no es gratis, y el notificador de terminal no está disponible en sistemas anteriores a 10.8, tiendo a usar cocoaDialog . Es gratuito y de código abierto, por lo que probablemente también pueda distribuirlo junto con sus scripts.

Si no necesita mucha personalización, también puede usar display notification de AppleScript, que también puede llamar desde el shell como ya han mencionado otros.

Pero cuidado, AppleScript parece requerir comillas dobles. Así que si necesita variables, este no funcionará :

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

Tendrá que usar comillas dobles escapadas. Esto es feo pero funciona :

osascript -e "display notification \"$text\" with title \"$title\""
    
respondido por el mivk 21.01.2013 - 10:59
6

Aquí hay una genial que utilizo en un script de ruby en OS X (para que pueda iniciar un script y obtener una actualización incluso después de alejarme de la ventana):

cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )
    
respondido por el JayCrossler 14.10.2014 - 22:13
6

(Esta es una implementación alternativa basada en la excelente respuesta de @grgarside)

AppleScript se puede interpretar directamente al poner osascript en la línea 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

Guarda esto como notify en algún lugar de tu ruta, por ejemplo, /usr/local/bin/notify , y hazlo ejecutable ( chmod +x notify ) Acepta un mensaje y un título opcional. Si alguno de ellos tiene espacios en blanco, envuélvalo entre comillas para que el shell lo interprete como un solo argumento.

$ notify "Lorem ipsum dolor sit amet" "Testing Notifications"
    
respondido por el Steve 30.11.2017 - 23:27
4

Documentación oficial

enlace

Copia el texto aquí, en caso de que el documento se mueva o elimine.

  

Para mostrar una notificación, proporcione al comando de notificación de pantalla una cadena para mostrar. Opcionalmente, proporcione valores para los parámetros de título, subtítulo y nombre de sonido para proporcionar información adicional y una alerta audible cuando aparezca la notificación

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

NOTA

     

Después de usar una secuencia de comandos para mostrar una notificación, la secuencia de comandos o el Editor de secuencias de comandos (si la secuencia de comandos se ejecuta desde el Editor de secuencias de comandos) se agrega a la lista de aplicaciones de notificación en Preferencias del sistema > Notificaciones Allí, puede configurar opciones, como mostrar las notificaciones como alertas o banners.

     

Al hacer clic en el botón Mostrar en una notificación de estilo de alerta, se abre la aplicación que muestra la notificación. Para una aplicación de secuencia de comandos, la acción de abrir la aplicación de nuevo activa el controlador de ejecución de la secuencia de comandos, lo que puede hacer que la secuencia de comandos comience a procesarse por segunda vez. Tenga esto en cuenta y agregue código a su secuencia de comandos para manejar este escenario, si corresponde.

    
respondido por el nishanths 01.01.2018 - 07:05
2

Una alternativa:

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

Utilice el comando: sys-notify "title" "message"

    
respondido por el ronald8192 24.10.2017 - 10:47

Lea otras preguntas en las etiquetas