Come ricevere una notifica quando i miei comandi sono stati eseguiti


64

Sto eseguendo una serie di comandi sulla riga di comando che richiede circa venti minuti per essere completato. Vorrei vedere una sorta di notifica sul mio Mac quando questi sono finiti, quindi non ho bisogno di monitorare il terminale per quando finisce. C'è un modo per fare questo?

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

Modifica :

Potrei usare xclockma questo sembra un trucco. Idealmente, potrei inviare la notifica ovunque, come telefono, schermo, ecc.


2
Sebbene tu sia alla riga di comando, penso che la risposta qui sia in realtà specifica per Mac e non relativa a Unix / Linux. Questo perché penso che probabilmente vorrai usare Growl e grownlnotify.

Questo non è un comando integrato, almeno sulla mia scatola.

growl.info Growl è il programma a cui fa riferimento @mattdm.
jsbillings

Risposte:


58

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


1
Questo è un meraviglioso esempio dell'uso degli operatori di shell &&per mettere insieme diversi comandi e concludere con un collettivo ||o un'istruzione per generare un errore. +1 in effetti
bmike

2
Bello! Per essere in grado di farlo in fretta, però, mi arrendo le informazioni successo errori contro e aggiunto un alias globale al mio zsh: alias -g sd='; say done'. Questo significa che devo solo aggiungere sdqualsiasi comando e riceverò una notifica.
wrtsprt,

Ben fatto. e ora ho qualcosa con cui giocare
Marco Prins

Ho provato, sia fatto che sia l'errore si dice sempre :( Esempio:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka,

1
Molto maneggevole. Ho fatto eco con ciò say -v Zarvoxche fa saltare tutti nelle vicinanze, questa è una notifica leggermente meno allarmante.
Siddhartha,

52

In Mac OS 10.8 puoi inviarti messaggi nel Centro notifiche (simile a Growl ma integrato in Mac OS).

Dai un'occhiata a " Invia un avviso al Centro notifiche dalla riga di comando in OS X " per vedere come installare una gemma Ruby che ti consentirà di inviare notifiche dalla riga di comando. Per semplificare il caso d'uso comune del solo preoccuparsi del fatto che qualcosa nel terminale venga fatto, aggiungi un alias al tuo .bash_profile:

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

Quindi puoi semplicemente fare:

$ <long-running task> ; notifyDone

Una volta terminata l'attività di lunga durata, otterrai un bel popup modale che persiste fino a quando non fai clic su di esso:

Popup Centro notifiche


10
terminale-notifica può essere installato tramite homebrew anche: brew install terminal-notifier. Quindi puoi semplicemente scrivere myCommand && terminal-notifier -message 'finished'. Testato su OS X Yosemite (10.10.1).
Pwdr,

4
In caso myCommand; terminal-notifier -message 'finished'contrario, la notifica non verrà visualizzata in caso di myCommanderrore.
aheuermann,

1
Ottima soluzione! A proposito, questo non produce alcun suono come le altre notifiche di OS X. Qualche soluzione per quello?
SexyBeast

1
@Cupidvogel potresti semplicemente aggiungere un saycomando, ad esempio my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett

2
Varie risposte a questa domanda forniscono molti più dettagli: apple.stackexchange.com/questions/57412/…
Joshua Goldberg

20

Usa Growl .

Nel .dmgfile, cerca gli extra, c'è un file binario growlnotify. Installalo, qualcosa come dentro /usr/local/bin. Quindi puoi usare questo comando

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

per mostrare un popup, come quello:

ringhiare


2
Uso quasi questo approccio esatto ma estendo Growl con Prowl in modo che Growl possa inviare la notifica al mio iPhone.
Ian C.

3
Mountain Lion's Notification Center rende Growl superfluo ... vedi la mia risposta su come usarlo per questo.
Tom Crockett,

16

A partire da Mac OS X Lion 10.7, Terminal ha alcuni nuovi indicatori di stato per aiutare con problemi come questo:

Nelle schede:

  • Attività: un indicatore di attività (indicatore di avanzamento di rotazione) viene visualizzato quando è stato emesso un output recente al terminale. Ciò consente di vedere se è attualmente occupato o ha completato un lungo processo. (O, ovviamente, puoi usarlo per dire quando ha iniziato a produrre output dopo aver eseguito il lavoro in silenzio per un po '.)

  • Non letto: viene visualizzato un puntino di sospensione "..." per indicare un nuovo testo non letto nelle schede di sfondo. Quando si seleziona la scheda, l'indicatore viene cancellato.

  • Avviso: viene visualizzata una "campana" per indicare quando è stata scritta una BEL su schede o finestre di sfondo. Inoltre, Terminale visualizza un badge rosso sull'icona dell'applicazione, che indica il numero di avvisi / campane "non letti" in tutti i terminali. Se il Terminale stesso è in background, rimbalza anche l'icona del Dock quando viene suonata una campana.

Nella finestra ridotta a icona Icone Dock:

  • Attività: l'attività viene indicata visualizzando il nome del processo in primo piano.

  • Non letto: il testo non letto è indicato da un puntino di sospensione.

  • Le finestre dei terminali ridotte a icona mostrano i contenuti live nelle loro icone del Dock. Questo può essere usato per vedere se c'è attività, o anche per determinare cosa sta facendo il terminale, se l'output che stai cercando è identificabile (ad esempio, un display "top" è abbastanza facile da riconoscere anche a dimensioni ridotte). Ciò è particolarmente utile quando si attiva l'ingrandimento del Dock o si ha spazio per un Dock di grandi dimensioni.

Inoltre, potresti visualizzare qualcosa nel terminale per attirare la tua attenzione (che sarebbe visibile anche nelle finestre ridotte a icona). Per esempio:

  • Mostra un asterisco grande: banner \*

  • Invertire il display: printf '\e[?5h'

  • Dipingi il display in rosso: tput setab 1; tput clear

  • Siediti in loop, facendo lampeggiare lo schermo: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Esistono anche codici di escape per manipolare le finestre (sposta, imposta dimensioni, zoom, minimizza, ecc.). È possibile ingrandire la finestra Terminale, ad esempio:

printf '\e[9;1t'

Vedi "manipolazione delle finestre" su http://invisible-island.net/xterm/ctlseqs/ctlseqs.html per i dettagli.

Un altro approccio è utilizzare AppleScript per visualizzare un avviso in una finestra separata:

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

Ottimo uso di tput e sequenze di escape: hai tutto tranne un messaggio a scorrimento nella barra del titolo!
bmike

12

So di essere in ritardo alla domanda, ma penso che ci sia un piccolo pezzo mancante che potrebbe essere utile. Ho scoperto che, mentre è pulito, avere il tuo terminale a parlare con te non è esattamente funzionale. Cosa c'è di meglio è qualcosa di più sottile come questo:

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

Come ha sottolineato Chris, Lion ha aggiunto piccoli badge di notifica quando viene lanciata una BEL. Puoi lanciarlo tu stesso con il comando:

tput bel

Quindi, se stai facendo un po 'di lavoro in background e vuoi una notifica al termine, puoi provare qualcosa del tipo:

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

Questo esegue il comando ping come attività in background (l'impiccagione e lo compie) e ha un semplice avviso al termine. Storicamente BEL è stato usato per emettere quel [terribile] bip hardware, tuttavia Lion lo ha sostituito con gusto con l'effetto sonoro "comando non valido", un badge di notifica e l'icona del terminale che rimbalza due volte nel dock.


1
printf '\a'sarebbe equivalente a tput bel. Si noti che il Terminale non rimbalza sull'icona del Dock se la scheda che ha causato l'avviso è attualmente attiva.
Lri,

5

Vi presento in questa risposta due cose:

  • L'opzione di utilizzo afplay, che riproduce file audio , per la notifica.
  • i miei strumenti per la segnalazione dello stato di uscita insieme alla notifica.

Ho questo script ~/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

Questo suona un suono diverso a seconda che l'argomento sia 0. Quindi ho un alias:

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

(Che abbiano lo stesso nome è irrilevante e probabilmente una cattiva idea.)

Per usarlo nel tuo esempio svn update . && ant clean build start; donebeep,. Si noti che sto usando ;piuttosto che &&, in modo che possa avvisarmi di fallimento e di successo.

Prima di venire a conoscenzaafplay , sayinvece, parlavo messaggi. Il ruolo di è donebeepstato interpretato da questo script:

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

Questo script parla direttamente il codice di uscita invece di avere due messaggi diversi. Menziona anche il nome della directory corrente (per aiutare a chiarire quale compito viene svolto) e può essere dato un testo aggiuntivo da dire passando parametri all'alias (ecco perché l'alias ha "$@"in esso). Nota il trailing in &modo da non dover attendere il termine del discorso prima di ricevere un prompt.


La pagina man diafplay è incompleta; afplay -helenca tutte le opzioni:

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

4

È inoltre possibile utilizzare il comando build in say per la notifica, ad esempio: dire "ant: build: done". Vedi: l'uomo dice nel terminal.



1

Ho scritto ntfyesattamente per questo scopo. È multipiattaforma e può inviare automaticamente notifiche al termine dei comandi di lunga durata.

Se hai Python pip(la maggior parte delle distribuzioni Linux e MacOS ce l'hanno), ecco come installarlo e abilitare le notifiche automatiche:

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

Dai un'occhiata a http://ntfy.rtfd.io

Oltre a ciò, può anche:

  • sopprimere le notifiche automatiche quando il terminale è in primo piano (X11, iTerm2 e Terminal.app supportati e abilitati per impostazione predefinita)
  • inviare notifiche basate su cloud (Pushover, Pushbullet e XMPP)
  • essere utilizzato per inviare notifiche al termine di un processo (non il supporto automatico sopra menzionato)
  • inviare notifiche manualmente (buono per l'uso negli script!)

1

iTerm2 ha un meccanismo integrato per ricevere notifiche ma devi installare Shell Integration .

Quando si avvia un comando di lunga durata, selezionare:
Modifica> Segni e annotazioni> Avvisi> Avviso sul segno successivo ( ⌥Option+ ⌘Command+ A)

Quando viene visualizzato il prompt dei comandi, è possibile selezionare tra:

  • Mostra casella avviso modale
  • Pubblica notifica (esempio screenshot)


0

Ubuntu fornisce il seguente alias in ~ / .bashrc:

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$//'\'')"'

Con questo, puoi quindi fare cose come:

make; alert
sleep 10; alert

Forse ce n'è un equivalente notify-sendin Mac OSX? Ho visto popup simili in Windows sia su Mac che su Ubuntu.


Sei sul sito Apple. Per far sì che questa sia una risposta, spiega come accedere notify-senda Mac OS X.
Daniel Beck,

4
Sono d'accordo che questo è un po 'inappropriato, ma in realtà l'ho trovato utile. Sono arrivato a questa domanda da Google e la mia domanda originale non era specifica per Mac. Come il poster originale, voglio un modo per non dover monitorare il mio terminale quando eseguo un comando che richiede molto tempo; Mi capita di usare Ubuntu: /
allyourcode il

0

Il mio problema con i suoni e le finestre modali è che non riesco a capire da dove vengano. Attualmente lavoro con un sacco di spazi, e talvolta verso l'alto di 20 finestre terminali.

La mia soluzione è portatile sul lato Unix e dovrebbe funzionare con qualsiasi cosa che supporti le sequenze di escape ansi. Questa soluzione funziona con Snow Leopard e probabilmente funzionerà con versioni più antiche del terminale.

Riga singola in .bash_profile

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

Abbattendo quello:

$* 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.

Se non ti piace il rosso, il colore di sfondo dei codici di escape di ascii google. Si noti che ciò non cambia l'intero schermo in rosso, ma solo qualsiasi cosa venga emessa al termine del comando.


0

Ho realizzato una sceneggiatura per risolvere questo problema che è qui . Non è necessario alcun software aggiuntivo per questo. Installazione:
brew install akashaggarwal7/tools/tsay
uso:
sleep 5; tsay

Sentiti libero di contribuire!


Motivo del downvote?
Akash Agarwal,

0

Ecco la mia funzione bash (mettila ovunque nel tuo ~/.bashrco ~/.zshrc:

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

Per usarlo: watch echo 'hi there'

Puoi anche personalizzare il suono di notifica come documentato qui: https://apple.stackexchange.com/a/115373/9622


0

Faccio quel genere di cose tutto il tempo. La mia riga di comando potrebbe essere simile

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

Se i comandi bin/setupe bundle installvengono completati correttamente, sentirò la voce di sistema / dettatura dire "Tutto fatto". Se uno dei primi due errori viene disattivato, la &&catena non verrà seguita e tutto ciò che ascolterò sarà "Fine".


0

Puoi usare il osascriptcomando integrato per eseguire uno script Apple che mostra una notifica, ad es

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

Puoi metterlo insieme con un semplice punto e virgola, ad es

your-command ; osascript -e '....'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.