Growl-Benachrichtigungen zum Abschluss von Shell-Aufgaben

4958
ezrock

(OSX-spezifisch)

Ich, wie viele andere außer mir selbst, starte oft einen Prozess in der Shell, der ein oder zwei Minuten dauert (zum Beispiel ein großes svn-Commit). Während dieser Zeit ändere und rede ich oft reddit / slashdot / wikipedia / was auch immer. Es wäre großartig, wenn Sie etwas eingerichtet haben, das eine Knallbenachrichtigung veröffentlicht, wenn der Shell-Prozess abgeschlossen ist.

In meiner idealen Welt würde es so funktionieren: "Wenn ein Prozess gerade aus einem geöffneten Tab in Terminal beendet wurde, geben Sie eine Knurrenbenachrichtigung ab."

Hat noch jemand so etwas eingerichtet?

12
Beachten Sie, dass Growl Sie nur benachrichtigt, wenn Sie noch am Bildschirm sitzen. Verwenden Sie für längere Programme den Befehl "say", um einen Audio-Hinweis zu erhalten, dass das Programm beendet ist. vor 14 Jahren 1
@mankoff: Sie können die Benachrichtigungseinstellungen für die Anwendung "Growlnotify" in "Growl.prefPane" so konfigurieren, dass sie einen Audio-Benachrichtigungston enthalten. Es ist jedoch nicht veränderbar, abhängig von dem Befehl, den Sie ausführen, wie "say" wäre. Aber es ist weniger gruselig. Daniel Beck vor 14 Jahren 0

8 Antworten auf die Frage

11
Daniel Beck

Sie können dazu growlnotify installieren .

$ ./some_program && growlnotify Title -m Message

Natürlich müssen Sie darüber nachdenken, bevor Sie Ihren Befehl ausführen. Die Alternative (ich weiß nicht, wie ich das erreichen kann) wäre eine Growl-Benachrichtigung für jeden einzelnen Befehl, die wahnsinnig nervig wäre.


Um die Verwendung von Growlnotify für Ihren Anwendungsfall zu vereinfachen, bearbeiten ~/bash_profileSie Folgendes und fügen Sie Folgendes hinzu:

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

jetzt kannst du einfach long your_command(ähnlich sudo). Ctrl-APositioniert den Cursor am Anfang der Zeile, wenn Sie (wie ich) immer zuerst den eigentlichen Befehl eingeben und anschließend das Präfix hinzufügen müssen.

Mein bash-fu reicht leider nicht aus, um den Befehl der growlnotifyNachricht hinzufügen zu können


Kommentar von per @ mankoff zu dieser Antwort:

Sie können einfach eingeben, während der Befehl ausgeführt wird. Er wird danach ausgeführt. Ich habe folgende Funktion für mich erstellt:

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

Verwenden als gn svn.

Sie müssen vor dem Befehl nicht darüber nachdenken. Wenn Sie wissen, dass Sie während des laufenden Vorgangs benachrichtigt werden möchten, geben Sie einfach "gn foo" (oder "say done" für Audiohinweise) ein, drücken Sie die Eingabetaste, und der Befehl wird ausgeführt, wenn der aktuelle Befehl abgeschlossen ist . vor 14 Jahren 2
Sie kommentieren dies automatisiert ... Verwenden Sie PS1 oder etwas, um einen Zeitstempel zu berühren. Verwenden Sie PS2, um zu überprüfen, wie lange PS1 es bereits berührt hat. Wenn es> n Sekunden war, führen Sie growlnotify aus. Jetzt ist es nicht nervig, weil es nicht bei jedem Befehl vorkommt. vor 14 Jahren 0
@mankoff wahr Eine einfache Funktion zur Reduzierung der Typisierung reicht also aus. Daniel Beck vor 14 Jahren 0
@mankoff PS2? Ist das nicht nur die Aufforderung zur Fortsetzung? Es wird nicht jeder Ausgabezeile ein Präfix vorangestellt ..? Daniel Beck vor 14 Jahren 0
Die PS1 / PS2 waren nur Vermutungen als Orte, an denen ich anfangen würde zu suchen, wenn ich dies implementieren wollte. Vielleicht kann das Ganze nur in PS1 eingebettet werden. Und vielleicht gibt es ganz andere Möglichkeiten, um ein generisches Setup für jeden Befehl zu erstellen. vor 14 Jahren 0
Nun, was die Zeit angeht, denke ich, dass das Auswerten des Datums gegenüber dem Datum, an dem der Befehl ausgeführt wurde, funktionieren sollte. Für mich werde ich diesen Teil nicht machen, denke ich, weil es einfach gut ist, die 'gn'-Funktion zu erstellen und nach einem längeren Befehl aufzurufen. ezrock vor 14 Jahren 0
Ich traf aber einen Haken. Was für eine ID ich sonst wo bin. Ich bin zum Beispiel in eine Remote-Maschine eingebunden und starte einen Sicherungsjob. Ich kann nicht $ [user @ remotemachine] backup.sh machen; gn, na ja, gn wird nicht so funktionieren. Recht? Ideen? ezrock vor 14 Jahren 0
@ezrock ja, weil der Befehl **, den Ihr ** Rechner ausführt, natürlich ssh ist. In diesem Artikel (http://bruce.pennypacker.org/2009/12/23/sending-messages-to-growl-remotely-for-irssi-integration/) können Sie dies aus der Ferne tun. Daniel Beck vor 14 Jahren 0
Der Nachteil der Funktion ist, dass sie beim Ausführen eines Alias ​​nicht funktioniert, da der Alias ​​nicht innerhalb der Funktion erweitert wird. Wenn Sie beispielsweise "gn ll" ausführen, wird behauptet, dass "ll" kein bekannter Befehl ist. nwinkler vor 12 Jahren 0
@nwinkler `man bash` gibt an, dass Aliasnamen für fast jeden Zweck durch Funktionen ersetzt werden. Es ist nicht überraschend, wenn 'll' eine Funktion wäre, würde es funktionieren. Daniel Beck vor 12 Jahren 0
2
roguesys

Was Sie brauchen growlnotify, ist ein CLI-Programm, um Knallbenachrichtigungen auszulösen. Sie könnten es verwenden als:

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

Es gibt ein paar weitere Knöpfe, mit denen Sie spielen können, growlnotify -hfür weitere Informationen

Vielen Dank. Ich habe gerade kommentiert, als ich das auch gefunden habe. Semikolon ist auch sinnvoller als das &&. ezrock vor 14 Jahren 0
@ezrock Ich denke, man könnte `&&` und `||` verwenden, um unterschiedliche Meldungen zwischen Erfolgs- und Fehlerzuständen zu haben. Wenn jedoch nur jemand daran interessiert ist, dass eine Meldung angezeigt wird, nachdem der Befehl ausgeführt wurde, ist `;;` narrensicher. =) roguesys vor 14 Jahren 1
2
bmucklow

Modifiying Daniel Beck's answer if you do this slight change it makes it very nice.

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

Then when you run 'long svn up' you will see message 'svn up completed.'

Very nice if you run many time consuming shell scripts at the same time.

2
ezrock

Jetzt, da OSX 10.8 und höher systemeigene Benachrichtigungen enthält, erreiche ich dasselbe Ziel über Terminal-Notifier :

  1. Brühen installieren
  2. $ brew install terminal-notifier
  3. Fügen Sie dies zu ~/.bash_profile:

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

Stellen Sie sicher, dass Sie Ihr Profil mit . ~/.bash_profile(für zukünftige Terminalsitzungen nicht erforderlich) bereitgestellt haben, da Ihr Profil beim Erstellen einer Sitzung automatisch erstellt wird.

Testen Sie es mit Ihrem Lieblingsbefehl, gefolgt vom Funktionsaufruf.

ls ; gn 

Die Argumente für Terminal-Notifier können sich zwar verbessern, aber ein schneller Versuch, den vorherigen Befehl für die Übergabe an die Funktion zu nutzen, war nicht erfolgreich und dies bringt mir alle Funktionen, die ich brauche. Hinzufügen ;gn, um eine Benachrichtigung am Ende eines lang andauernden Prozesses zu erhalten.

1
fideli

Verwenden Sie Growlnotify .

ls && growlnotify -H localhost -m "message" 
1
Kristian Domagala

This is a way to have it invoked automatically for "long running" processes: http://hints.macworld.com/article.php?story=20071009124425468

It hooks into the $PROMPT_COMMAND and notifies completion of processes taking longer than 10 seconds to complete. You may need to tweak it to suit your own environment and workflow (for example, ignoring completion of less or editor invocation), but it seems to work reasonably well out of the box.

Ich habe es selbst nicht ausprobiert, aber der vollständig automatisierte Ansatz klingt wirklich ansprechend. Alle anderen Lösungen hier müssen im Voraus wissen, dass der Befehl lange dauert und das Skript ausgelöst wird (dh ls; growlnotify). Ich mag die Idee, sie nicht manuell auslösen zu müssen. ezrock vor 10 Jahren 0
0
ezrock

Ich stöberte nur noch etwas herum und fand eine einfache Methode dafür. Es ist ein bisschen mehr Handbuch, als ich es gerne hätte, aber hier geht es.

  1. Installieren Sie growlnotify (im Extras-Ordner des Installationsdownloads von Growl) 1.
  2. Hängen Sie < && growlnotify -m "Message"> an einen langen Prozess an.

Das funktioniert jetzt für mich, aber ich könnte es besser machen, Methinks.

0
stiemannkj1

OSX 10.9+ -Lösung ohne Software von Drittanbietern:

In OSX 10.9 und höher können Sie den AppleScript-Befehl verwenden display notification, um ein Knurren vom Terminal aus anzuzeigen, wie es so ist:

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

Wenn Sie nicht jedes Mal alles eingeben möchten, können Sie Folgendes verwenden alias:

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

Beispiel:

long-running-script.sh; growl