Wie erhalte ich eine Benachrichtigung, wenn meine Befehle ausgeführt wurden?


61

Ich führe eine Reihe von Befehlen in der Befehlszeile aus, die ungefähr zwanzig Minuten dauern. Ich möchte eine Art Benachrichtigung auf meinem Mac sehen, wenn diese beendet sind, damit ich das Terminal nicht überwachen muss, wenn es beendet ist. Gibt es eine Möglichkeit, dies zu tun?

$ svn update . && ant clean build start && *notify_me_somehow*

Bearbeiten :

Ich könnte es gebrauchen, xclockaber das scheint ein Hack zu sein. Idealerweise könnte ich die Benachrichtigung überallhin senden, z. B. auf meinem Handy, Bildschirm usw.


2
Obwohl Sie sich in der Befehlszeile befinden, denke ich, dass die Antwort hier tatsächlich Mac-spezifisch und nicht Unix / Linux-bezogen ist. Das liegt daran, dass Sie wahrscheinlich Growl und verwenden möchten grownlnotify.

Das ist kein eingebautes Kommando, zumindest bei meiner Box.

growl.info Growl ist das Programm, auf das @mattdm verweist.
Jsbillings

Antworten:


58

(svn update . && ant clean build start && say done) || say error


1
Dies ist ein wunderbares Beispiel für die Verwendung von Shell-Operatoren, &&um mehrere Befehle zu verketten und sie mit einem Kollektiv ||oder einer Anweisung zum Auslösen eines Fehlers zusammenzufassen. +1 in der Tat
bmike

2
Nett! Um dies jedoch schnell tun zu können, habe ich die Informationen zu Fehler und Erfolg aufgegeben und meinem zsh: einen globalen Alias ​​hinzugefügt alias -g sd='; say done'. Das heißt, ich muss nur einen sdBefehl hinzufügen und werde benachrichtigt.
Wrtsprt

Schön. und jetzt habe ich etwas zu spielen
Marco Prins

Versucht und beides getan und Fehler werden immer gesagt :( Beispiel:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka

1
Sehr praktisch. Ich habe mit say -v Zarvoxdem Echo gemacht , das alle in der Nähe zum Springen bringt, dies ist eine etwas weniger alarmierende Benachrichtigung.
Siddhartha

50

In Mac OS 10.8 können Sie sich selbst Notification Center-Nachrichten senden (ähnlich wie Growl, jedoch in Mac OS integriert).

Lesen Sie " Eine Benachrichtigung über die Befehlszeile in OS X an das Notification Center senden ", um zu erfahren, wie Sie einen Ruby-Gem installieren, mit dem Sie Benachrichtigungen über die Befehlszeile senden können. Fügen Sie Ihrem .bash_profile einen Alias ​​hinzu, um den allgemeinen Anwendungsfall zu vereinfachen, bei dem nur darauf geachtet wird, dass etwas im Terminal ausgeführt wird:

alias notifyDone='terminal-notifier -title "Terminal" -message "Done with task!"'

Dann können Sie einfach tun:

$ <long-running task> ; notifyDone

Sobald die lang laufende Aufgabe abgeschlossen ist, wird ein nettes modales Popup angezeigt, das so lange angezeigt wird, bis Sie darauf klicken:

Benachrichtigungscenter Popup


9
Terminal-Notifier über installiert sein Homebrew auch: brew install terminal-notifier. Dann kannst du einfach schreiben myCommand && terminal-notifier -message 'finished'. Getestet unter OS X Yosemite (10.10.1).
Pwdr

4
Sie sollten ausführen, myCommand; terminal-notifier -message 'finished'sonst wird die Benachrichtigung nicht angezeigt, wenn dies myCommandfehlschlägt.
Aheuermann

Geniale Lösung! Dies erzeugt übrigens keinen Klang wie andere OS X-Benachrichtigungen. Irgendeine Lösung dafür?
SexyBeast

@Cupidvogel Sie könnten einfach einen sayBefehl hinzufügen , z. B. my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett

1
Verschiedene Antworten auf diese Frage geben viel mehr Details: apple.stackexchange.com/questions/57412/…
Joshua Goldberg

20

Verwende Growl .

.dmgSuchen Sie in der Datei nach den Extras. Es gibt eine Growlnotify-Binärdatei. Installieren Sie es, so etwas wie in /usr/local/bin. Dann können Sie diesen Befehl verwenden

growlnotify --sticky --appIcon <icon> --message <message> -t <title>

So zeigen Sie ein Popup an:

knurren


2
Ich verwende fast genau diesen Ansatz, aber ich erweitere Growl mit Prowl, sodass Growl die Benachrichtigung an mein iPhone senden kann.
Ian C.

3
Das Benachrichtigungscenter von Mountain Lion macht das Knurren unnötig ... siehe meine Antwort, wie man es dafür verwendet.
Tom Crockett

16

Ab Mac OS X Lion 10.7 verfügt das Terminal über einige neue Statusanzeigen, um bei Problemen wie diesen zu helfen:

In Registerkarten:

  • Aktivität: Eine Aktivitätsanzeige (Fortschrittsanzeige) wird angezeigt, wenn kürzlich eine Ausgabe auf dem Terminal erfolgt ist. Auf diese Weise können Sie feststellen, ob der Computer gerade beschäftigt ist oder einen langen Prozess abgeschlossen hat. (Oder Sie können damit natürlich auch feststellen, wann nach einer Weile stiller Arbeit mit der Ausgabe begonnen wurde.)

  • Ungelesen: Ein Auslassungszeichen "…" weist auf neuen, ungelesenen Text in den Hintergrundregistern hin. Wenn Sie die Registerkarte auswählen, wird die Anzeige gelöscht.

  • Warnung: Eine "Glocke" wird angezeigt, um anzuzeigen, wann eine BEL in Hintergrundregisterkarten oder Hintergrundfenster geschrieben wurde. Darüber hinaus zeigt das Terminal ein rotes Symbol auf dem Anwendungssymbol an, das die Anzahl der "ungelesenen" Warnungen / Glocken in allen Terminals angibt. Befindet sich das Terminal selbst im Hintergrund, wird beim Spielen einer Klingel auch das Dock-Symbol angezeigt.

Im minimierten Fenster Dock-Symbole:

  • Aktivität: Die Aktivität wird angezeigt, indem der Name des Vordergrundprozesses angezeigt wird.

  • Ungelesen: Ungelesener Text wird durch Auslassungspunkte gekennzeichnet.

  • Minimierte Terminalfenster zeigen Live-Inhalte in ihren Dock-Symbolen. Dies kann verwendet werden, um festzustellen, ob Aktivität vorliegt, oder um sogar zu bestimmen, was das Terminal tut, wenn die gesuchte Ausgabe identifizierbar ist (z. B. ist eine "obere" Anzeige selbst bei kleinen Größen ziemlich einfach zu erkennen). Dies ist besonders nützlich, wenn die Dock-Vergrößerung aktiviert ist oder Sie Platz für ein großes Dock haben.

Außerdem könnten Sie im Terminal etwas anzeigen, um Ihre Aufmerksamkeit auf sich zu ziehen (was auch in minimierten Fenstern sichtbar wäre). Zum Beispiel:

  • Zeigen Sie ein großes Sternchen an: banner \*

  • Invertieren Sie die Anzeige: printf '\e[?5h'

  • Malen Sie das Display rot: tput setab 1; tput clear

  • Setzen Sie sich in eine Schleife und blinken Sie den Bildschirm: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Es gibt auch Escape-Codes zum Bearbeiten von Fenstern (Verschieben, Einstellen der Größe, Zoomen, Minimieren usw.). Sie können das Terminalfenster vergrößern, zum Beispiel:

printf '\e[9;1t'

Weitere Informationen finden Sie unter "Fensterbearbeitung" unter http://invisible-island.net/xterm/ctlseqs/ctlseqs.html .

Ein anderer Ansatz ist die Verwendung von AppleScript, um eine Warnung in einem separaten Fenster anzuzeigen:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'

Hervorragende Verwendung von tput und Escape-Sequenzen - Sie haben alles außer einer Bildlaufnachricht in der Titelleiste!
bmike

12

Ich weiß, dass ich zu spät bei der Frage bin, aber ich denke, dass ein kleines Stück fehlt, das hilfreich sein könnte. Ich habe festgestellt, dass es nicht gerade praktisch ist, Ihr Terminal mit Ihnen zu sprechen, obwohl es ordentlich ist. Was besser ist, ist etwas subtileres wie dieses:

http://i.stack.imgur.com/FaZmF.png

Wie Chris betonte, hat Lion kleine Benachrichtigungsabzeichen hinzugefügt, wenn ein BEL geworfen wird. Sie können es selbst mit dem Befehl werfen:

tput bel

Wenn Sie also im Hintergrund arbeiten und eine Benachrichtigung erhalten möchten, können Sie Folgendes versuchen:

ping -c 5 www.google.com && tput bel &

Dadurch wird der Ping-Befehl als Hintergrundaufgabe ausgeführt (das Aufhängen und Ausführen dieses Befehls), und es wird eine einfache Warnung ausgegeben, wenn der Vorgang abgeschlossen ist. In der Vergangenheit wurde BEL verwendet, um diesen [schrecklichen] Hardware-Piepton zu erzeugen. Lion hat diesen jedoch geschmackvoll durch den Soundeffekt "Ungültiger Befehl", ein Benachrichtigungsabzeichen und das Terminal-Symbol ersetzt, das zweimal im Dock abprallt.


1
printf '\a'wäre gleichbedeutend mit tput bel. Beachten Sie, dass das Terminal das Dock-Symbol nicht anzeigt, wenn die Registerkarte, die die Warnung ausgelöst hat, gerade aktiv ist.
Lri

4

Sie können auch den Befehl build in say zur Benachrichtigung verwenden, z. B .: say "ant: build: done". Siehe: Mann sagt im Terminal.


4

Ich präsentiere in dieser Antwort zwei Dinge:

  • Die Option afplay, Audiodateien zur Benachrichtigung abzuspielen .
  • Meine Tools zum Melden des Beendigungsstatus zusammen mit der Benachrichtigung.

Ich habe dieses Skript ~/bin/donebeep:

#!/bin/bash
if [ "$@" = 0 ]; then
  afplay -v 2 /System/Library/Sounds/Blow.aiff &
else
  afplay -v 2 /System/Library/Sounds/Sosumi.aiff &
fi

Dies spielt einen anderen Sound ab, abhängig davon, ob das Argument 0 ist. Dann habe ich einen Alias:

alias donebeep='(savestatus=$?; ~/bin/donebeep $savestatus "$@"; exit $savestatus)'

(Dass sie den gleichen Namen haben, ist irrelevant und wahrscheinlich eine schlechte Idee.)

Um es zu verwenden in Ihrem Beispiel svn update . && ant clean build start; donebeep. Beachten Sie, dass ich ;eher als verwende &&, damit es mich sowohl über Fehler als auch über Erfolg benachrichtigen kann.

Bevor ich davon erfuhrafplay , saysprach ich stattdessen Nachrichten. Die Rolle von donebeepwurde von diesem Skript gespielt:

#!/bin/bash
say -v Bruce "Done $(basename "$(pwd)"), $@." &

Dieses Skript spricht den Exit-Code direkt, anstatt zwei verschiedene Nachrichten zu haben. Außerdem wird der Name des aktuellen Verzeichnisses angegeben (um zu verdeutlichen, welche Aufgabe erledigt ist) und es kann zusätzlicher Text angegeben werden, indem Parameter an den Alias ​​übergeben werden (aus diesem Grund enthält der Alias "$@"). Beachten Sie das Ende, &damit Sie nicht warten müssen, bis die Rede beendet ist, bevor Sie eine Eingabeaufforderung erhalten.


Die Manpage fürafplay ist unvollständig; afplay -hlistet alle Optionen auf:

Usage:
afplay [option...] audio_file

Options: (may appear before or after arguments)
  {-v | --volume} VOLUME
    set the volume for playback of the file
  {-h | --help}
    print help
  { --leaks}
    run leaks analysis  {-t | --time} TIME
    play for TIME seconds
  {-r | --rate} RATE
    play at playback rate
  {-q | --rQuality} QUALITY
    set the quality used for rate-scaled playback (default is 0 - low quality, 1 - high quality)
  {-d | --debug}
    debug print output


1

Ich habe ntfygenau zu diesem Zweck geschrieben. Es ist plattformübergreifend und kann automatisch Benachrichtigungen senden, wenn lange laufende Befehle beendet sind.

Wenn Sie Pythons haben pip(die meisten Linux-Distributionen und MacOS haben es), installieren Sie es wie folgt und aktivieren Sie automatische Benachrichtigungen:

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

Überprüfen Sie es auf http://ntfy.rtfd.io

Darüber hinaus kann es auch:

  • Automatische Benachrichtigungen unterdrücken, wenn sich das Terminal im Vordergrund befindet (X11, iTerm2 und Terminal.app werden standardmäßig unterstützt und aktiviert)
  • Cloud-basierte Benachrichtigungen senden (Pushover, Pushbullet und XMPP)
  • Wird verwendet, um Benachrichtigungen zu senden, wenn ein Prozess endet (nicht die oben genannte automatische Unterstützung).
  • Benachrichtigungen manuell senden (gut für die Verwendung in Skripten!)

1

iTerm2 hat einen eingebauten Mechanismus, um Benachrichtigungen zu erhalten, aber Sie müssen die Shell-Integration installieren .

Wenn Sie einen Befehl mit langer Laufzeit starten, wählen Sie:
Bearbeiten> Marken und Anmerkungen> Warnungen> Bei nächster Marke warnen ( ⌥Option+ ⌘Command+ A)

Wenn die Eingabeaufforderung zurückkehrt, können Sie wählen zwischen:

  • Modal Alert Box anzeigen
  • Post Notification (Beispiel-Screenshot)


0

Ubuntu liefert den folgenden Alias ​​in ~ / .bashrc aus:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

Mit diesem können Sie dann Folgendes tun:

make; alert
sleep 10; alert

Vielleicht gibt es ein Äquivalent zu notify-sendin Mac OSX? Ich habe in Mac und Ubuntu ähnliche Popup-Fenster gesehen.


Sie befinden sich auf der Apple-Website. Um dies zu beantworten, erläutern Sie bitte, wie Sie notify-sendauf Mac OS X
Daniel Beck

4
Ich stimme zu, dass dies irgendwie unangemessen ist, aber ich fand das tatsächlich hilfreich. Ich bin von Google auf diese Frage gekommen, und meine ursprüngliche Frage war nicht Mac-spezifisch. Wie beim Original-Poster möchte ich, dass mein Terminal nicht überwacht werden muss, wenn Befehle ausgeführt werden, die lange dauern. Ich benutze gerade Ubuntu: /
allyourcode

0

Mein Problem mit Sounds und modalen Fenstern ist, dass ich nicht sagen kann, woher sie kommen. Derzeit arbeite ich mit einer Reihe von Leerzeichen und manchmal mehr als 20 Terminalfenstern.

Meine Lösung ist auf Unix-Seite portierbar und sollte mit allen funktionieren, die ansi-Escape-Sequenzen unterstützen. Diese Lösung funktioniert mit Snow Leopard und möglicherweise auch mit älteren Terminalversionen.

Einzelne Zeile in .bash_profile

function watch { $* ; echo -n -e "\033[41m" ;  echo $* DONE ;  date ;  echo -n -e "\033[0m" ; }

Aufschlüsselung:

$* expands to the original command I want to watch.
first escape sequence changes background color to red
echo repeats the command (with red background, the word DONE.
Running Date tells you when it finished.
last escape resets the terminal to what it was.

Wenn Sie Rot nicht mögen, Google ASCII-Escape-Codes Hintergrundfarbe. Beachten Sie, dass dies nicht den gesamten Bildschirm rot ändert, sondern nur die Ausgabe nach Beendigung des Befehls.


0

Ich habe ein Skript , dieses Problem zu lösen , das ist hier . Sie benötigen dafür keine zusätzliche Software. Installation:
brew install akashaggarwal7/tools/tsay
Verwendung:
sleep 5; tsay

Fühlen Sie sich frei, einen Beitrag zu leisten!


Grund für die Ablehnung?
Akash Agarwal

0

Hier ist meine Bash-Funktion (platziere sie einfach irgendwo in deinem ~/.bashrcoder ~/.zshrc:

watch(){
  cmd=$@ # Somehow interpolate $@ directly doesn't work.
  $@ && say 'Watch Completed!' && osascript -e "display notification \"Completed: $cmd\" with title \"Watch Alert\""
}

Um es zu benutzen: watch echo 'hi there'

Sie können den Benachrichtigungston auch wie hier dokumentiert anpassen: https://apple.stackexchange.com/a/115373/9622


0

Ich mache so etwas die ganze Zeit. Meine Kommandozeile könnte so aussehen

$ rm Gemfile.lock && bin/setup && bundle install --binstubs && say "All"; say "done"

Wenn die Befehle bin/setupund bundle installerfolgreich ausgeführt wurden, wird die System- / Diktatstimme "Alles erledigt" anzeigen. Wenn einer der ersten beiden Fehler ausfällt, wird die &&Kette nicht befolgt, und alles, was ich hören werde, ist "Fertig".


0

Mit dem eingebauten osascriptBefehl können Sie ein Apple-Skript ausführen, das eine Benachrichtigung anzeigt, z

osascript -e 'display notification "Command done" with title "Your title here"'

Sie können es mit einem einfachen Semikolon, z

your-command ; osascript -e '....'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.