Growl-Benachrichtigungen für die Beendigung von Shell-Aufgaben

12

(OSX-spezifisch)

Ich starte, wie viele andere außer mir, oft einen Prozess in der Shell, der ein oder zwei Minuten dauert (zum Beispiel ein großes svn-Commit). In dieser Zeit drücke ich oft die Alt-Tab-Taste und aktualisiere reddit / slashdot / wikipedia / whatever. Es wäre toll, wenn etwas eingerichtet wäre, das eine Growl-Benachrichtigung sendet, wenn der Shell-Prozess abgeschlossen ist.

In meiner idealen Welt würde das so aussehen: "Wenn ein Prozess gerade von einem Tab beendet wird, der im Terminal geöffnet ist, poste eine Growl-Benachrichtigung."

Hat noch jemand so etwas eingerichtet?

Ezrock
quelle
1
Beachten Sie, dass das Knurren Sie nur benachrichtigt, wenn Sie noch am Bildschirm sitzen. Verwenden Sie bei längeren Programmen den Befehl "say", um einen Audiohinweis zu erhalten, dass der Vorgang abgeschlossen ist.
@mankoff: Sie können die growlnotifyEinstellungen für die Anwendungsbenachrichtigung so konfigurieren Growl.prefPane, dass sie einen Audio-Benachrichtigungston enthalten. Sie kann jedoch nicht abhängig von dem Befehl geändert werden, den Sie ausführen say. Aber es ist viel weniger gruselig.
Daniel Beck

Antworten:

11

Sie können hierzu 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ß allerdings nicht, wie ich das erreichen soll) wäre eine Growl-Benachrichtigung für jeden einzelnen Befehl, was wahnsinnig nervig wäre.


Bearbeiten ~/bash_profileund fügen Sie Folgendes hinzu , um die Verwendung von growlnotify für Ihren Anwendungsfall zu vereinfachen :

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

jetzt kannst du einfach long your_command(ähnlich wie 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


per @ mankoffs Kommentar zu dieser Antwort:

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

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

Verwenden Sie als gn svn.

Daniel Beck
quelle
2
Sie müssen vor dem Befehl nicht daran denken. Wenn Sie während der Ausführung feststellen, dass Sie benachrichtigt werden möchten, geben Sie einfach "gn foo" ein (oder sagen Sie "done" für Audio-Hinweise) und drücken Sie die Eingabetaste. Dieser Befehl wird ausgeführt, wenn der aktuelle Befehl beendet ist .
Wenn Sie dies automatisch kommentieren ... Verwenden Sie PS1 oder etwas, um einen Zeitstempel zu berühren. Mit PS2 kannst du überprüfen, seit wann PS1 es berührt hat. Wenn> n Sekunden vergangen sind, führen Sie growlnotify aus. Jetzt ist es nicht ärgerlich, weil es nicht bei jedem Befehl vorkommt.
@mankoff Richtig. Eine einfache Funktion zur Reduzierung der Eingabe ist also ausreichend.
Daniel Beck
@mankoff PS2? Ist das nicht nur die Eingabeaufforderung für die Fortsetzung? Es wird nicht jeder Ausgabezeile ein Präfix vorangestellt.
Daniel Beck
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 in nur PS1 eingebettet werden. Und vielleicht gibt es ganz andere Möglichkeiten, ein generisches Growl-for-Every-Command-Setup durchzuführen.
2

Was Sie brauchen growlnotify, ist ein CLI-Programm zum Auslösen von Growl-Benachrichtigungen. Sie könnten es verwenden als:

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

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

Roguesys
quelle
Vielen Dank. Ich habe es nur zur gleichen Zeit kommentiert, als ich das auch fand. Semikolon ist sinnvoller als das &&.
Ezrock
1
@ezrock Ich glaube, man könnte verschiedene Meldungen zwischen Erfolgs- und Fehlerzuständen verwenden &&und ||haben, aber wenn man nur an einer Meldung interessiert ist, die nach der Ausführung des Befehls angezeigt wird, ;;ist dies narrensicher. =)
Roguesys
2

Wenn Sie die Antwort von Daniel Beck ändern, wird es sehr schön, wenn Sie diese kleine Änderung vornehmen.

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

Wenn Sie dann "long svn up" ausführen, wird die Meldung "svn up finished" angezeigt.

Sehr schön, wenn Sie viele zeitaufwändige Shell-Skripte gleichzeitig ausführen.

bmucklow
quelle
2

Nachdem OSX 10.8 und höher über native Benachrichtigungen verfügt, erreiche ich dasselbe Ziel über Terminal-Notifier :

  1. Brauen einbauen
  2. $ brew install terminal-notifier
  3. Fügen Sie dies hinzu zu ~/.bash_profile:

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

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

Testen Sie mit Ihrem Lieblingsbefehl, gefolgt vom Funktionsaufruf.

ls ; gn

Die Argumente für Terminal-Notifier können sich verbessern, aber ein schneller Versuch, den vorherigen Befehl abzurufen, um ihn an die Funktion zu übergeben, war nicht erfolgreich und bietet mir alle Funktionen, die ich benötige. Hinzufügen ;gn, um eine Benachrichtigung am Ende eines lang andauernden Prozesses zu erhalten.

Ezrock
quelle
1

Dies ist eine Möglichkeit, es für "lange laufende" Prozesse automatisch aufzurufen : http://hints.macworld.com/article.php?story=20071009124425468

Es $PROMPT_COMMANDschließt sich an und benachrichtigt den Abschluss von Prozessen, die länger als 10 Sekunden dauern. Möglicherweise müssen Sie die Einstellungen an Ihre Umgebung und Ihren Arbeitsablauf anpassen (z. B. das Ignorieren des Abschlusses lessoder des Editoraufrufs), aber es scheint ziemlich gut zu funktionieren.

Kristian Domagala
quelle
Ich habe es selbst nicht ausprobiert, aber der vollständig automatisierte Ansatz klingt wirklich ansprechend. Alle anderen Lösungen hier setzen voraus, dass Sie im Voraus wissen, dass der Befehl lange ausgeführt wird, und sich daran erinnern, das Skript auszulösen (dh ls; growlnotify). Ich mag die Idee, es nicht manuell auslösen zu müssen.
Ezrock
0

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

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

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

Ezrock
quelle
0

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 wie folgt anzuzeigen:

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
stiemannkj1
quelle