Notifications Growl pour la fin de la tâche Shell

12

(Spécifique OSX)

Comme beaucoup d'autres que moi, je me retrouve souvent à lancer un processus dans le shell qui prend une minute ou deux (un gros svn commit par exemple). Pendant ce temps, j'alt-tab souvent et rafraîchis reddit / slashdot / wikipedia / peu importe. Ce serait formidable d'avoir quelque chose mis en place qui publie une notification de grognement lorsque le processus shell est terminé.

Dans mon monde idéal, cela fonctionnerait comme ceci: "Si un processus vient de sortir d'un onglet ouvert dans Terminal, publiez une notification de grognement."

Quelqu'un d'autre a quelque chose comme ça mis en place?

ezrock
la source
1
Notez que le grognement ne vous avertira que si vous êtes toujours assis à l'écran. Pour les programmes plus longs, utilisez la commande "say" pour obtenir une indication audio que c'est terminé.
@mankoff: vous pouvez configurer les growlnotifyparamètres de notification d'application Growl.prefPanepour inclure un son de notification audio. Il n'est cependant pas modifiable en fonction de la commande que vous exécutez, comme ce sayserait le cas. Mais c'est beaucoup moins effrayant.
Daniel Beck

Réponses:

11

Vous pouvez installer growlnotify pour ce faire.

$ ./some_program && growlnotify Title -m Message

Bien sûr, vous devez y penser avant d'exécuter votre commande. L'alternative (je ne sais pas comment y parvenir cependant) serait une notification Growl pour chaque commande, ce qui serait incroyablement ennuyeux.


Pour simplifier l'utilisation de growlnotify pour votre cas d'utilisation, modifiez ~/bash_profileet ajoutez les éléments suivants:

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

maintenant vous pouvez simplement long your_command(similaire à sudo). Ctrl-Apositionne le curseur au début de la ligne, si vous (comme moi) tapez toujours la commande réelle en premier et devez ajouter le préfixe ensuite.

Mon bash-fu est malheureusement insuffisant pour pouvoir ajouter la commande au growlnotifymessage


par le commentaire de @ mankoff à cette réponse:

Vous pouvez simplement taper pendant l'exécution de la commande, elle est ensuite exécutée. J'ai créé la fonction suivante pour moi:

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

Utiliser comme gn svn.

Daniel Beck
la source
2
Vous n'avez pas besoin d'y penser avant la commande. Si, pendant qu'il est en cours d'exécution, vous vous rendez compte que vous souhaitez être averti quand il est terminé, tapez simplement "gn foo" (ou "dites terminé", pour des conseils audio), appuyez sur Entrée, et cette commande s'exécutera lorsque celle en cours se terminera .
Re commentez-vous de le faire automagiquement ... Utilisez PS1 ou quelque chose pour toucher un horodatage. Utilisez la PS2 pour vérifier depuis combien de temps la PS1 l'a touchée. Si cela fait> n secondes, exécutez Growlnotify. Maintenant, ce n'est pas gênant car cela ne se produit pas pour chaque commande.
@mankoff True. Une simple fonction de réduction de la frappe suffit donc.
Daniel Beck
@mankoff PS2? N'est-ce pas simplement l'invite de continuation? Il ne préfixe pas chaque ligne de sortie ..?
Daniel Beck
Les PS1 / PS2 n'étaient que des suppositions comme des endroits où je commencerais à chercher si je voulais implémenter cela. Peut-être que le tout peut être intégré à la PS1 uniquement. Et peut-être existe-t-il des façons entièrement différentes de créer une configuration générique de grognement pour chaque commande.
2

Ce dont vous avez besoin, c'est d' growlnotifyun programme CLI pour déclencher les notifications de grognement. Vous pouvez l'utiliser comme:

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

Il a quelques boutons de plus avec lesquels vous pouvez jouer, utilisez growlnotify -hpour plus d'informations

roguesys
la source
Merci. J'ai juste commenté en même temps quand j'ai trouvé ça aussi. Le point-virgule est également plus logique que le &&.
ezrock
1
@ezrock Je pense que l'on pourrait utiliser &&et ||avoir des messages différents entre les états de réussite et d'échec, mais si l'on ne s'intéresse qu'à un message affiché après l'exécution de la commande, alors ;;c'est infaillible. =)
roguesys
2

Modifier la réponse de Daniel Beck si vous faites ce léger changement, c'est très agréable.

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

Ensuite, lorsque vous exécutez «long svn up», vous verrez le message «svn up complete».

Très bien si vous exécutez plusieurs scripts shell prenant beaucoup de temps en même temps.

bmucklow
la source
2

Maintenant qu'OSX 10.8 et versions ultérieures ont des notifications natives, voici comment j'atteins le même objectif via terminal-notifier :

  1. Installer l'infusion
  2. $ brew install terminal-notifier
  3. Ajoutez ceci à ~/.bash_profile:

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

Assurez-vous d'avoir fourni votre profil avec . ~/.bash_profile(non nécessaire pour les futures sessions de terminal), car votre profil est automatiquement généré lors de la création d'une session.

Testez avec votre commande préférée, suivie de l'appel de fonction.

ls ; gn

Les arguments de terminal-notifier peuvent encore s'améliorer, mais une tentative rapide de saisir la commande précédente pour passer à la fonction n'a pas réussi et cela me donne toutes les fonctionnalités dont j'ai besoin. À savoir, ajouter ;gnpour obtenir une notification à la fin de tout processus de longue durée.

ezrock
la source
1

C'est un moyen de l'invoquer automatiquement pour les processus "de longue durée": http://hints.macworld.com/article.php?story=20071009124425468

Il se connecte à $PROMPT_COMMANDet signale la fin des processus prenant plus de 10 secondes. Vous devrez peut-être l'ajuster pour l'adapter à votre propre environnement et flux de travail (par exemple, ignorer la fin lessou l'invocation de l'éditeur), mais cela semble fonctionner assez bien dès le départ.

Kristian Domagala
la source
Je ne l'ai pas essayé moi-même, mais l'approche complètement automatisée semble vraiment attrayante. Toutes les autres solutions ici nécessitent de savoir à l'avance que la commande sera longue et de ne pas oublier de déclencher le script (par exemple, ls; growlnotify). J'aime l'idée de ne pas avoir besoin de le déclencher manuellement.
ezrock
0

Je viens de fouiller un peu plus et j'ai trouvé une méthode simple pour cela. C'est un peu plus manuel que je ne le souhaiterais, mais voilà.

  1. Installer growlnotify (Il se trouve dans le dossier des extras du téléchargement d'installation de Growl) 1.
  2. Ajoutez < && growlnotify -m "Message"> à un long processus.

Cela fonctionne pour moi en ce moment, mais je pourrais faire mieux, je pense.

ezrock
la source
0

Solution OSX 10.9+ sans logiciel tiers:

Dans OSX 10.9 et supérieur, vous pouvez utiliser la commande AppleScript display notificationpour afficher un grognement à partir du terminal comme suit:

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

Si vous ne voulez pas taper tout cela à chaque fois, vous pouvez utiliser un alias:

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

Exemple:

long-running-script.sh; growl
stiemannkj1
la source