Notifiche Growl per il completamento delle attività Shell


12

(Specifico OSX)

Io, come molti altri oltre a me stesso, mi ritrovo spesso a dare il via a un processo nella shell che richiede un minuto o due per completare (un grande svn commit per esempio). Durante quel periodo, spesso faccio alt-tab e aggiorno reddit / slashdot / wikipedia / qualunque cosa. Sarebbe bello avere qualcosa di impostato che pubblica una notifica ringhio quando il processo di shell è finito.

Nel mio mondo ideale, funzionerebbe in questo modo: "Se un processo è appena uscito da una scheda aperta in Terminale, pubblica una notifica di ringhio".

Qualcun altro ha qualcosa come questo impostato?


1
Nota che il ringhio ti avviserà solo se sei ancora seduto sullo schermo. Per programmi più lunghi, utilizzare il comando "dire" per ottenere un suggerimento audio che sia finito.

@mankoff: è possibile configurare le growlnotifyimpostazioni di notifica dell'applicazione in modo Growl.prefPaneda includere un suono di notifica audio. Tuttavia, non è modificabile a seconda del comando eseguito, come saysarebbe. Ma è molto meno inquietante.
Daniel Beck

Risposte:


11

È possibile installare growlnotify per farlo.

$ ./some_program && growlnotify Title -m Message

Naturalmente dovresti pensarci prima di eseguire il tuo comando. L'alternativa (non so come raggiungerlo però) sarebbe una notifica Growl per ogni singolo comando, che sarebbe follemente fastidiosa.


Per semplificare l'uso di growlnotify per il tuo caso d'uso, modifica ~/bash_profilee aggiungi quanto segue:

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

ora puoi semplicemente long your_command(simile a sudo). Ctrl-Aposiziona il cursore all'inizio della riga, se tu (come me) digiti sempre prima il comando effettivo e successivamente devi aggiungere il prefisso.

Sfortunatamente il mio bash-fu è insufficiente per poter aggiungere il comando al growlnotifymessaggio


per @ mankoff commento a questa risposta:

Puoi semplicemente digitare mentre il comando è in esecuzione, viene eseguito successivamente. Ho creato la seguente funzione per me:

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

Usa come gn svn.


2
Non è necessario pensarci prima del comando. Se, mentre è in esecuzione, ti rendi conto di voler ricevere una notifica al termine, digita "gn foo" (o "dire fatto", per i suggerimenti audio), premi Invio e quel comando verrà eseguito al termine di quello corrente .

Stai commentando come farlo automagicamente ... Usa PS1 o qualcosa per toccare un timestamp. Usa PS2 per verificare da quanto tempo PS1 lo tocca. Se è stato> n secondi, quindi esegui growlnotify. Ora non è fastidioso perché non accade per ogni comando.

@mankoff True. Quindi è sufficiente una semplice funzione per ridurre la digitazione.
Daniel Beck

@mankoff PS2? Non è solo il prompt di continuazione? Non prefissa ogni linea di output ..?
Daniel Beck

La PS1 / PS2 erano solo ipotesi come i posti in cui avrei iniziato a cercare se volevo implementarlo. Forse il tutto può essere incorporato solo in PS1. E forse ci sono modi completamente diversi per fare una configurazione generica di ringhio per ogni comando.

2

Ciò di cui hai bisogno è growlnotifyquale sia un programma CLI per attivare le notifiche ringhio. Puoi usarlo come:

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

Ha qualche altra manopola con cui puoi giocare, usa growlnotify -hper maggiori informazioni


Grazie. Ho appena commentato nello stesso momento in cui l'ho scoperto anch'io. Il punto e virgola ha più senso anche di &&.
ezrock,

1
@ezrock Immagino che si possano usare &&e ||avere messaggi diversi tra gli stati di successo e fallimento, ma se si è interessati solo a un messaggio che viene mostrato dopo l'esecuzione del comando, allora ;;è infallibile. =)
roguesys il

2

Modificando la risposta di Daniel Beck se fai questa leggera modifica, la rende molto piacevole.

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

Quindi quando esegui 'long svn up' vedrai il messaggio 'svn up completato'.

Molto bello se si eseguono molti script shell allo stesso tempo.


2

Ora che OSX 10.8 e versioni successive hanno notifiche native, è così che raggiungo lo stesso obiettivo tramite Terminal-Notifier :

  1. Installa birra
  2. $ brew install terminal-notifier
  3. Aggiungi questo a ~/.bash_profile:

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

Assicurati di aver fornito il tuo profilo . ~/.bash_profile(non necessario per future sessioni del terminale), poiché il tuo profilo viene fornito automaticamente durante la creazione di una sessione.

Prova con il tuo comando preferito, seguito dalla chiamata di funzione.

ls ; gn

Gli argomenti di Terminal-Notifier possono migliorare, ma un rapido tentativo di afferrare il comando precedente per passare alla funzione non ha avuto successo e questo mi dà tutte le funzionalità di cui ho bisogno. Vale a dire, aggiungendo ;gnper ottenere una notifica alla fine di qualsiasi processo di lunga durata.



1

Questo è un modo per invocarlo automaticamente per processi "di lunga durata": http://hints.macworld.com/article.php?story=20071009124425468

Si collega $PROMPT_COMMANDe notifica il completamento dei processi impiegando più di 10 secondi per il completamento. Potrebbe essere necessario modificarlo per adattarsi al proprio ambiente e flusso di lavoro (ad esempio, ignorando il completamento lesso l'invocazione dell'editor), ma sembra funzionare abbastanza bene fuori dalla scatola.


Non l'ho provato da solo, ma l'approccio completamente automatizzato sembra davvero allettante. Tutte le altre soluzioni qui richiedono di sapere in anticipo che il comando sarà di lunga durata e di ricordare di attivare lo script (ad es. Ls; growlnotify). Mi piace l'idea di non doverlo attivare manualmente.
ezrock,

0

Ho appena dato un'occhiata in giro e ho trovato un metodo semplice per questo. È un po 'più manuale di quanto vorrei, ma ecco qui.

  1. Installa growlnotify (si trova nella cartella degli extra del download dell'installazione di Growl) 1.
  2. Aggiungi < && growlnotify -m "Message"> a un lungo processo.

Questo funziona per me in questo momento, ma potrei fare di meglio, penso.


0

Soluzione OSX 10.9+ senza software di terze parti:

In OSX 10.9 e versioni successive, è possibile utilizzare il comando AppleScript display notificationper visualizzare un ringhio dal terminale in questo modo:

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

Se non si desidera digitare tutto ciò ogni volta, è possibile utilizzare un alias:

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

Esempio:

long-running-script.sh; growl
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.