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


301

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

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

Idealmente, el tipo y el ícono de la notificación podrían controlarse, pero se agradecería incluso la posibilidad de activar un banner básico con un ícono común (pero texto personalizado).


Respuestas:


423

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 hay 3 rd bibliotecas -partido o aplicaciones requiere y es completamente portátil para su uso en otros sistemas. Notificación 10.9 en la parte superior, 10.10 DP en el medio, 10.10 en la parte inferior.

AppleScript se puede ejecutar desde el shell usando / usr / bin / osascript:

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

También puede personalizar aún más la alerta agregando ...

  • un subtitulo

    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:

  • sonar

    Agregue 'nombre de 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 sonidos ubicados en ...

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

Las notificaciones de publicación se pueden ajustar como un script 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, agregar 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 agregará lo anterior para notificar.

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

99
@ceilingcat Esto es AppleScript. Para ejecutarlo en Terminal, use osascript (vea la respuesta).
grg

8
El único problema display notificationes que cuando hace clic en él, aparece el cuadro de diálogo Abrir archivo.
Augoƃı

77
¿Es posible hacer que la ventana emergente notificatiop exista para siempre (no se oculta automáticamente después de N segundos) hasta que el usuario haga clic explícitamente?
Sridhar Ratnakumar

23
Señoras y señores, después de una hora de investigación en la red mundial, ¡descubrí cómo dejar que la ventana de notificación permanezca hasta que el usuario la descarte! En realidad, estaba controlado por una configuración en Preferencia del sistema, en lugar de algún parámetro en el script escrito. Estas dos imágenes deberían explicarlo todo i.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg Diviértanse, muchachos, y gracias @grgarside por la excelente respuesta.
Vic Jang

44
Tenga en cuenta que el texto debe estar entre comillas dobles. Las comillas simples no funcionan. Así que si usted necesita una variable en el texto, no se puede escribir "display ... '$mytext' ...", pero la necesidad escapado comillas dobles: "display notification \"$mytext\" ...".
mivk

92

notificador de terminal

Desde el archivo Léame:

terminal-notifier es una herramienta de línea de comandos para enviar notificaciones de usuario de Mac OS X, que están disponibles en Mac OS X 10.8.

Actualmente está empaquetado como un paquete de aplicaciones, porque NSUserNotificationno funciona desde una 'herramienta Foundation'. radar: // 11956694

Kicker utilizará esta herramienta para mostrar el estado de los comandos que se ejecutan debido a cambios en el sistema de archivos. (v3.0.0)

Descargar

Los binarios precompilados, que están firmados con código y listos para usar, están disponibles en la sección de descargas .

Uso

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

Para usar el notificador de terminal, debe 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, reemplazando las notificaciones publicadas anteriormente. Los ejemplos son: el ID del proceso del remitente para abarcar las notificaciones mediante un proceso único o el directorio de trabajo actual para abarcar las notificaciones de un proyecto.

Los argumentos segundo y tercero describen la notificación en sí y son su 'título' y 'mensaje' respectivamente. Por ejemplo, para comunicar al remitente de una notificación al usuario, puede especificar el nombre del remitente como título.

El cuarto y último argumento es opcional. Especifica qué aplicación debe activarse cuando el usuario hace clic en la notificación. De forma predeterminada, esto activará Terminal.app, para iniciar otra aplicación, en lugar de especificar el identificador de paquete de la aplicación. Por ejemplo, para poner en marcha el uso Safari.app: com.apple.Safari.


Dulce, una gran biblioteca! Me encantaría verlo actualizado con control sobre el ícono y alerta vs banner, pero definitivamente útil. Gracias por el enlace! i.imgur.com/tsCeK.png
Nathan Greenstein

2
Pequeña aplicación genial, creé un lanzador y puse / usr / local / bin para que pueda usarlo desde cualquier terminal, etc. Script de inicio: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/ MacOS ./terminal-notifier $ *
johanandren

44
El iniciador es útil, si lo cambia un poco, funciona con texto entre comillas con espacios: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard

27

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

Comparación

He encontrado la solución para ti:

En realidad, estaba controlado por una configuración en Preferencia del sistema, en lugar de algún parámetro en el script escrito. Estas dos imágenes deberían explicarlo todo

Gracias @grgarside por la excelente respuesta.

Preferencia del sistema


55
Tenga en cuenta que la aplicación específica variará. Script Editores solo para Script Editor.appy osascript. En un flujo de trabajo de servicio, es Automator Runner. Cuando está adentro Automator.app, es Automator.
cde

1
Me resulta molesto que si hago clic en el Banner, aparezca la aplicación Editor de secuencias de comandos. Me gustaría que desapareciera al hacer clic, pero esta publicación señala que puede pasar el mouse sobre él y deslizar el dedo hacia la derecha para hacer que desaparezca en silencio: osxdaily.com/2012/09/05/…
Joshua Goldberg

@ JoshuaGoldberg ¡Gracias por agregar eso! Descubrí eso intuitivamente un día, que es una cosa que me gusta de Mac OS X, funciona de la manera que esperas que funcione :)
Vic Jang

22

Ahora puede hacer esto con Growl2 ( disponible en la App Store ). Instale Growl y active "Notificaciones de OS X" (captura de pantalla)

ingrese la descripción de la imagen aquí

Además, deberá instalar GrowlNotify para una herramienta de línea de comandos para enviar notificaciones Growl. Puede descargar esta herramienta de forma gratuita en la página de descargas .

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

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

ingrese la descripción de la imagen aquí

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


1
Buen enfoque, especialmente si ya está instalado el gruñido.
Besi

1
Creo que puedes usar la opción --icon path/to/icon.pngde íconos.
Será

¿En desuso / ya no se mantiene? La última actualización fue para macos 10.9 mavericks
Seamus

15

Recientemente bifurqué al terminal-notificador para construir una herramienta de línea de comandos para mostrar Alertas de notificación (con acciones) y Alertas de tipo de respuesta.

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

https://github.com/vjeantet/alerter

ingrese la descripción de la imagen aquí


1
También aparentemente en desuso / abandonado.
Seamus

15

La solución de @grgarside 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, para 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"'

Esto es interesante, pero ¿puede describir un escenario en el que un script que ejecuto en mi sistema que solo es ejecutable por el usuario sea vulnerable a la inyección de script?
iconoclasta

1
Si muestra contenido de usuario que no es suyo, es vulnerable. Por ejemplo, si ejecuta esto en un sistema con un servidor web público, o cuando alguna aplicación registra cadenas que obtuvo de la red que lee y muestra, por ejemplo, un navegador, un programa de correo o un cliente de Twitter. Podría tener un "para terminar la cadena y la instrucción, luego tener código y luego reiniciar una cadena."
Archimedix

Vale, eso es verdad. Es difícil para mí imaginarme poner contenido de formularios web en mis notificaciones, pero su punto es claro.
iconoclasta

1
Bueno, tal vez le gustaría decir algo así I have a "laser"sin que le digan que tiene un error de sintaxis al "citar" sus "palabras". Al escapar, puede:script 'I have a "laser"'
Archimedix

1
Vota porque siempre es bueno tener en cuenta la seguridad. Alguien podría copiar soluciones de pasta y usarlas de maneras que la persona que publica la solución no había considerado.
Edward Falk

12

Como Growl no es gratuito y el notificador de terminal no está disponible en los 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 AppleScript, display notificationque también puede llamar desde el shell como ya han mencionado otros.

Pero tenga en cuenta que AppleScript parece requerir comillas dobles. Entonces, si necesita variables, esto 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\""

Esto también funciona:osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
MikeSchinkel

También en desuso. El enlace produce "No hay un sitio de páginas de GitHub aquí".
Seamus

11

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

AppleScript se puede interpretar directamente colocando osascriptla 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

Guarde esto como notifyen algún lugar de su ruta, por ejemplo /usr/local/bin/notify, y hágalo ejecutable ( chmod +x notify). Acepta un mensaje y un título opcional. Si alguno tiene un espacio en blanco, envuélvalo entre comillas para que el shell lo interprete como un argumento único.

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

Esto evita los ataques de inyección a los que todas las otras respuestas son vulnerables
Neil Mayhew

7

Aquí hay uno genial que utilizo en un script 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 )

2
wow ... entonces la cadena es algo así como Usuario -> Ruby -> Shell -> AppleScript -> Objective-C -> Assembly -> CPU?
iconoclasta

5

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"

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


5

Documentación oficial

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

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

Para mostrar una notificación, proporcione al comando de notificación de visualización una cadena para mostrar. Opcionalmente, proporcione valores para los parámetros con 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 notificaciones como alertas o pancartas.

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 nuevamente 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 script para manejar este escenario, si corresponde.


1

Gracias, esto era justo lo que necesitaba para algunos scripts de usuario. Hice una ligera modificación para agregar un subtítulo y sonido. Si no se proporciona un valor, se ignora.

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"

Para el sonido, use un nombre de archivo de sonido sin la extensión de / System / Library / Sounds. Por ejemplo, para usar el archivo Ping.aiff, use Ping por $ 4