Notificações de rosnado para conclusão de tarefas do Shell

12

(Específico para OSX)

Eu, como muitos outros além de mim, frequentemente me vejo iniciando um processo no shell que leva um ou dois minutos para ser concluído (um grande svn commit, por exemplo). Durante esse período, costumo usar alt-tab e atualizar reddit / slashdot / wikipedia / o que for. Seria ótimo ter algo configurado que publique uma notificação de rosnado quando o processo do shell terminar.

No meu mundo ideal, funcionaria assim: "Se um processo sair de uma guia aberta no Terminal, publique uma notificação de rosnado".

Alguém mais tem algo assim configurado?

ezrock
fonte
1
Observe que o rosnado apenas o notificará se você ainda estiver sentado na tela. Para programas mais longos, use o comando "say" para obter uma dica de áudio de que foi concluído.
@mankoff: Você pode definir as configurações de growlnotifynotificação do aplicativo Growl.prefPanepara incluir um som de notificação de áudio. No entanto, não é mutável, dependendo do comando que você executa, como sayseria. Mas é bem menos assustador.
Daniel Beck

Respostas:

11

Você pode instalar o growlnotify para fazer isso.

$ ./some_program && growlnotify Title -m Message

Claro que você precisaria pensar nisso antes de executar seu comando. A alternativa (embora eu não saiba como conseguir isso) seria uma notificação de Growl para cada comando, o que seria insanamente irritante.


Para simplificar o uso de growlnotify para seu caso de uso, edite ~/bash_profilee adicione o seguinte:

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

agora você pode simplesmente long your_command(semelhante a sudo). Ctrl-Aposiciona o cursor no início da linha, se você (como eu) sempre digitar o comando real primeiro e precisar adicionar o prefixo posteriormente.

Infelizmente, meu bash-fu é insuficiente para poder adicionar o comando à growlnotifymensagem


pelo comentário de @ mankoff a esta resposta:

Você pode simplesmente digitar enquanto o comando está sendo executado, sendo executado posteriormente. Eu criei a seguinte função para mim:

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

Use como gn svn.

Daniel Beck
fonte
2
Você não precisa pensar nisso antes do comando. Se, enquanto estiver em execução, você perceber que deseja ser notificado quando terminar, basta digitar "gn foo" (ou "dizer pronto", para obter dicas de áudio), pressione enter e esse comando será executado quando o atual terminar .
Você comenta sobre fazer isso automaticamente? Use o PS1 ou algo assim para tocar em um carimbo de data / hora. Use o PS2 para verificar quanto tempo o PS1 o tocou. Se já tiver passado> n segundos, execute growlnotify. Agora não é irritante porque não acontece para todos os comandos.
@mankoff True. Portanto, uma função simples para reduzir a digitação é suficiente.
Daniel Beck
@mankoff PS2? Não é apenas o prompt de continuação? Não prefixa todas as linhas de saída ..?
Daniel Beck
O PS1 / PS2 eram apenas suposições como lugares que eu começaria a procurar se quisesse implementar isso. Talvez a coisa toda possa ser incorporada apenas no PS1. E talvez haja maneiras totalmente diferentes de fazer uma configuração genérica de rosnar para cada comando.
2

O que você precisa é growlnotifyqual é um programa CLI para acionar notificações de crescimento. Você pode usá-lo como:

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

Tem mais alguns botões com os quais você pode brincar, use growlnotify -hpara obter mais informações

roguesys
fonte
Obrigado. Eu apenas comentei ao mesmo tempo em que achei isso também. O ponto e vírgula faz mais sentido do que o && também.
ezrock
1
@ezrock Eu acho que alguém poderia usar &&e ||ter mensagens diferentes entre estados de sucesso e falha, mas se alguém estiver interessado apenas em uma mensagem sendo mostrada após a execução do comando, isso ;;é infalível. =)
roguesys
2

Modificar a resposta de Daniel Beck, se você fizer essa pequena alteração, torna muito agradável.

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

Então, quando você executar 'svn up longo', você verá a mensagem 'svn up concluída.'

Muito bom se você executar muitos scripts de shell demorados ao mesmo tempo.

bmucklow
fonte
2

Agora que o OSX 10.8 e posterior tem notificações nativas, é assim que eu realizo o mesmo objetivo via terminal-notifier :

  1. Instalar cerveja
  2. $ brew install terminal-notifier
  3. Adicione isto a ~/.bash_profile:

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

Verifique se você originou seu perfil . ~/.bash_profile(não necessário para futuras sessões de terminal), pois seu perfil é originado automaticamente ao criar uma sessão.

Teste com seu comando favorito, seguido pela chamada de função.

ls ; gn

Os argumentos para o notificador de terminal podem melhorar bastante, mas uma tentativa rápida de pegar o comando anterior para passar para a função não foi bem-sucedida e isso me dá toda a funcionalidade necessária. Ou seja, adicionar ;gnpara receber uma notificação no final de qualquer processo de longa execução.

ezrock
fonte
1

Esta é uma maneira de invocá-lo automaticamente para processos de "longa execução": http://hints.macworld.com/article.php?story=20071009124425468

Ele se conecta $PROMPT_COMMANDe notifica a conclusão dos processos, levando mais de 10 segundos para ser concluída. Pode ser necessário ajustá-lo para se adequar ao seu próprio ambiente e fluxo de trabalho (por exemplo, ignorando a conclusão lessou a chamada do editor), mas parece funcionar razoavelmente bem.

Kristian Domagala
fonte
Eu ainda não tentei, mas a abordagem completamente automatizada parece realmente atraente. Todas as outras soluções aqui requerem conhecimento prévio de que o comando será demorado e lembrará de acionar o script (ou seja, ls; growlnotify). Eu gosto da ideia de não precisar acioná-lo manualmente.
ezrock
0

Acabei de bisbilhotar um pouco mais e encontrei um método simples para isso. É um pouco mais manual do que eu gostaria que fosse, mas aqui vai.

  1. Instale growlnotify (está na pasta extras do download da instalação do Growl) 1.
  2. Acrescente < && growlnotify -m "Message"> a um processo longo.

Isso funciona para mim agora, mas eu poderia fazer melhor, acho.

ezrock
fonte
0

Solução OSX 10.9+ sem software de terceiros:

No OSX 10.9 e superior, você pode usar o comando AppleScript display notificationpara exibir um rosnado do terminal da seguinte maneira:

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

Se você não quiser digitar tudo isso toda vez, poderá usar um alias:

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

Exemplo:

long-running-script.sh; growl
stiemannkj1
fonte