Notificaciones de gruñido para completar la tarea de Shell

12

(OSX específico)

Yo, como muchos otros además de mí, a menudo me encuentro iniciando un proceso en el shell que tarda uno o dos minutos en completarse (un gran compromiso de svn, por ejemplo). Durante ese tiempo, a menudo hago alt-tab y actualizo reddit / slashdot / wikipedia / lo que sea. Sería genial tener algo configurado que publique una notificación de gruñido cuando finalice el proceso de shell.

En mi mundo ideal, funcionaría así: "Si un proceso acaba de salir de una pestaña abierta en la Terminal, publique una notificación de gruñido".

¿Alguien más tiene algo como esto?

ezrock
fuente
1
Tenga en cuenta que gruñido solo le notificará si todavía está sentado en la pantalla. Para programas más largos, use el comando "decir" para obtener una pista de audio de que está terminado.
@mankoff: puede configurar los growlnotifyajustes de notificación de la aplicación Growl.prefPanepara incluir un sonido de notificación de audio. Sin embargo, no se puede cambiar según el comando que ejecute, como saysería. Pero es mucho menos espeluznante.
Daniel Beck

Respuestas:

11

Puede instalar growlnotify para hacer esto.

$ ./some_program && growlnotify Title -m Message

Por supuesto, necesitaría pensar en esto antes de ejecutar su comando. La alternativa (no sé cómo lograr esto) sería una notificación de Growl para cada comando, lo que sería increíblemente molesto.


Para simplificar el uso de growlnotify para su caso de uso, edite ~/bash_profiley agregue lo siguiente:

function long {
    $@
    /usr/local/bin/growlnotify Finished -m 'Done'
}

ahora puedes simplemente long your_command(similar a sudo). Ctrl-Acoloca el cursor al comienzo de la línea, si usted (como yo) siempre escribe primero el comando real y luego necesita agregar el prefijo.

Mi bash-fu es lamentablemente insuficiente para poder agregar el comando al growlnotifymensaje


según el comentario de @mankoff a esta respuesta:

Simplemente puede escribir mientras se ejecuta el comando, se ejecuta después. Creé la siguiente función para mí:

function gn {
    /usr/local/bin/growlnotify Finished -m "$@"
}

Usar como gn svn.

Daniel Beck
fuente
2
No necesita pensarlo antes del comando. Si, mientras se está ejecutando, se da cuenta de que desea recibir una notificación cuando haya terminado, simplemente escriba "gn foo" (o "diga hecho", para obtener pistas de audio), presione Intro, y ese comando se ejecutará cuando finalice el actual. .
Re comentar sobre hacer esto automáticamente ... Use PS1 o algo para tocar una marca de tiempo. Usa PS2 para verificar cuánto tiempo hace que PS1 lo tocó. Si han pasado> n segundos, ejecute growlnotify. Ahora no es molesto porque no sucede para cada comando.
@mankoff Cierto. Por lo tanto, una función simple para reducir la tipificación es suficiente.
Daniel Beck
@mankoff PS2? ¿No es esto solo el aviso de continuación? No prefija cada línea de salida ...?
Daniel Beck
La PS1 / PS2 eran solo conjeturas como lugares que comenzaría a buscar si quisiera implementar esto. Quizás todo se pueda integrar en solo PS1. Y tal vez hay formas completamente diferentes de hacer una configuración genérica de gruñido para cada comando.
2

Lo que necesita es growlnotifyqué es un programa CLI para activar notificaciones de gruñido. Podrías usarlo como:

./script.sh;; growlnotify -m "done"

Tiene algunas perillas más con las que puedes jugar, úsalas growlnotify -hpara obtener más información.

roguesys
fuente
Gracias. Acabo de comentar al mismo tiempo cuando encontré eso también. El punto y coma también tiene más sentido que el &&.
ezrock el
1
@ezrock Me imagino que uno podría usar &&y ||tener diferentes mensajes entre los estados de éxito y fracaso, pero si uno solo está interesado en que se muestre un mensaje después de que se ejecute el comando, entonces ;;es infalible. =)
roguesys
2

Modificando la respuesta de Daniel Beck si haces este ligero cambio, lo hace muy agradable.

function long {
    command=$@
    $command
    /usr/local/bin/growlnotify Finished -m "$command completed."
}

Luego, cuando ejecute 'svn up largo', verá el mensaje 'svn up completado'.

Muy bueno si ejecuta muchos scripts de shell que consumen mucho tiempo al mismo tiempo.

bmucklow
fuente
2

Ahora que OSX 10.8 y versiones posteriores tienen notificaciones nativas, así es como logro el mismo objetivo a través del notificador de terminal :

  1. Instalar cerveza
  2. $ brew install terminal-notifier
  3. Agregue esto a ~/.bash_profile:

    function gn {
        terminal-notifier  -message ' ' -title 'Finished'
    }

Asegúrese de haber obtenido su perfil . ~/.bash_profile(no es necesario para futuras sesiones de terminal), ya que su perfil se obtiene automáticamente al crear una sesión.

Pruebe con su comando favorito, seguido de la llamada a la función.

ls ; gn

Los argumentos para el terminal-notificador pueden soportar algunas mejoras, pero un intento rápido de tomar el comando anterior para pasar a la función no tuvo éxito y esto me da toda la funcionalidad que necesito. Es decir, agregar ;gnpara obtener una notificación al final de cualquier proceso de larga duración.

ezrock
fuente
1

Esta es una forma de invocarlo automáticamente para procesos de "ejecución prolongada": http://hints.macworld.com/article.php?story=20071009124425468

Se conecta $PROMPT_COMMANDy notifica la finalización de los procesos que demoran más de 10 segundos en completarse. Es posible que deba ajustarlo para adaptarse a su propio entorno y flujo de trabajo (por ejemplo, ignorando la finalización lesso la invocación del editor), pero parece funcionar razonablemente bien desde el primer momento.

Kristian Domagala
fuente
No lo he probado yo mismo, pero el enfoque completamente automatizado suena realmente atractivo. Todas las otras soluciones aquí requieren saber de antemano que el comando será de larga ejecución y recordar activar el script (es decir, ls; growlnotify). Me gusta la idea de no necesitar activarlo manualmente.
ezrock
0

Solo busqué un poco más y encontré un método simple para esto. Es un poco más manual de lo que me gustaría que fuera, pero aquí va.

  1. Instalar growlnotify (está en la carpeta extras de la descarga de instalación de Growl) 1.
  2. Añadir < && growlnotify -m "Message"> a un proceso largo.

Eso funciona para mí en este momento, pero creo que podría hacerlo mejor.

ezrock
fuente
0

Solución OSX 10.9+ sin software de terceros:

En OSX 10.9 y superior, puede usar el comando AppleScript display notificationpara mostrar un gruñido desde el terminal de la siguiente manera:

osascript -e 'display notification with title "Process Completed."'

Si no desea escribir todo eso cada vez, puede usar un alias:

alias growl='osascript -e "display notification with title \"Process Completed.\""'

Ejemplo:

long-running-script.sh; growl
stiemannkj1
fuente