3 votos

OS X: cree una función bash para enviar notificaciones a través de osascript / Applescript

Con la esperanza de que algunos se puede señalar lo que estoy haciendo mal. Después de mirar a través de varios hilos, además de un montón de experimentación, se siente como algo simple que está mal. Los hilos que he leído incluyen ¿Cómo puedo activar un Centro de Notificación la notificación de un AppleScript o secuencia de comandos de shell? y Cómo obtener una notificación cuando mi comandos se hace

Este script está diseñado para mínimamente técnico a los usuarios realizar el montaje de la onu y el montaje de las acciones. Ahora sólo es compatible con SMB, pero va a manejar NFS y otros remota de los montajes más tarde. Tenemos la restricción de que el usuario del sistema será la base de OS X instalación, por lo tanto no podemos instalar otras herramientas o bibliotecas.

El problema está apareciendo una ventana de notificación cuando se produce un evento, con el texto que incluye un espacio en el argumento pasado a la función. Si el argumento es sólo alfa/numérico, funciona bien.

Como punto de partida, estoy usando un trozo de código de randomor sobre Cómo obtener una notificación cuando mi comandos de hecho. El decir de comandos hace que sea mucho más fácil de decir cuando el script funciona, además, harán su agradable voz.

send_notify(){
cmd=$@
local $@ && say 'Completed!' && osascript -e "display notification \"Completed: $2\" with title \"$1\""
}

Mientras que no hay espacios en blanco en la cadena del argumento que se pasa de la función de llamada, tanto en el decir y la notificación de trabajo. Cuando hay un espacio en blanco en la cadena del argumento como de BARRAS "3" o en una variable que se pasa, el send_notify() la función devuelve un error.

Cuando se llama sin espacios en blanco, send_notify() funciona

send_notify "FOO" "BAR2" <<< This works

Esta falla debido a que el espacio en blanco

send_notify "FOO" "BAR 3"  <<< This fails

./sharemount.sh: line 138: local: `37': not a valid identifier

Curiosamente, el decir, el comando también no se puede ejecutar.

Parte del problema es mi falta de comprensión ¿qué papel "$@" juega en este comando. Si alguien tiene una explicación, sería muy bienvenida.

A continuación es una de las diversas funciones en la secuencia de comandos tha llamar a la send_notify() función.

Pre_Mount_Check() {
    Current_Share="$(df -t smbfs --output=source 2>/dev/null | sed '1d' | awk -F/ '{print tolower($NF)}')"
    Current_MountPoint="$(df -t smbfs --output=target 2>/dev/null | sed '1d')"
    logger -p Info "$DebugLog" "Sharemount:Pre_Mount_Check Checking to see if $Share_Path already exists"

    if [[ (-z "$Current_Share") && (-z "$Current_MountPoint") ]]; then 
        logger -p Info "$DebugLog" "Sharemount:Pre_Mount_Check $Share_Path on $Mount_Point is not mounted, we will try to mount it"
        return 0

    elif [[ ( "$Current_Share" = "$Share_Name") && ( "$Current_MountPoint" = *"$Mount_Point"*) ]]; then 
        logger -p Info "$DebugLog" "Sharemount:Pre_Mount_Check $Share_Path already mounted, nothing to do, exiting"
        echo "$Share_Path already mounted, nothing to do, exiting 1"
        exit 0

    elif
     [[ ( "$Current_Share" = "$Share_Name") ]]; then
        logger -p Warning "$DebugLog" "Sharemount:Pre_Mount_Check $Share_Path already mounted, on $Current_MountPoint, exiting"
        echo "$Share_Path already mounted, on $Current_MountPoint, exiting 2"
        send_notify "FOO" "BAR2" <<< This works
        exit 36

    elif [[ ( "$Current_MountPoint" = *"$Mount_Point"*) ]]; then
        logger -p Warning "$DebugLog" "Sharemount:Pre_Mount_Check $Share_Name is already mounted on $Mount_Point exiting"
        echo "$Share_Name is already mounted on $Mount_Point exiting 3"
        send_notify "FOO" "BAR 3"  <<< This fails
        exit 0

    fi
}

send_notify(){
cmd=$@
local $@ && say 'Completed!' && osascript -e "display notification \"Completed: $2\" with title \"$1\""
}

2voto

Thomas Nelson Puntos 144

Mostrar Notificaciones El Centro de notificaciones ofrece otra oportunidad para proporcionar retroalimentación durante la ejecución del script. El uso de las Adiciones Estándar de secuencias de comandos, además de la pantalla de notificación de comando para mostrar notificaciones, tales como actualizaciones de estado como se procesan los archivos.

Para mostrar una notificación, proporcionar la pantalla de notificación de comandos con una cadena a mostrar. Opcionalmente, proporcionar valores para el título, el subtítulo, el sonido y el nombre de los parámetros para proporcionar información adicional y una alerta sonora cuando la notificación aparece, como se muestra en el Listado 24-1 y Listado de 24-2.

APPLESCRIPT

Abrir en el Editor de secuencias de Comandos

Listado de 24 1AppleScript: Mostrar una notificación

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

JAVASCRIPT

Abrir en el Editor de secuencias de Comandos

Listado de 24 2JavaScript: Mostrar una notificación

var app = Application.currentApplication()

app.includeStandardAdditions = true

app.displayNotification("All graphics have been converted.", {
    withTitle: "My Graphic Processing Script",
    subtitle: "Processing is complete.",
    soundName: "Frog"
})

NOTA

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

Haciendo clic en el botón Mostrar en una alerta de notificación en estilo abre la aplicación que muestra la notificación. Para una secuencia de comandos de la aplicación, la acción de abrir la aplicación de nuevo desencadena la ejecución de controlador de la secuencia de comandos, potencialmente causando la secuencia de comandos para comenzar el proceso una segunda vez. Tenga esto en mente, y agregar código a la secuencia de comandos para manejar este escenario, si es apropiado.

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

2voto

Kevin Mason Puntos 49

Como señaló Thomas Nelson, había hecho esto demasiado complejo. Soltando el

 cmd=$@
local $@ && 
 

La secuencia resolvió el problema.

Aquí está la función terminada

     #######################
    ##### Send_Notify #####
    #######################

    # Call this and supply the text you want to have spoken ($1) and the notification message ($2)
    # ie: Send_Notify "This is my voice" "This is the message"
    Send_notify(){
    title="FOOScript"
    say "$1" && osascript -e "display notification \"$2\" with title \"$title\""
}
 

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X