Notificação em modo gráfico para shellscript

Shell-script, em uma explicação bem minimalista, é uma forma de automatizar tarefas que sem os quais deveriam ser feitas manualmente. Embora concebidos para rodarem em linha de comandos, é possível fazê-los apresentar  uma mensagem em modo gráfico usando o zenity ou a libnotify para que o usuário [iniciante] não precise usar a tão assustadora tela preta.

Eu já publiquei alguns script aqui no blog que utilizam o Zenity para exibir mensagens em modo gráfico para o usuário, tal como o script para agilizar o acesso SSH em várias máquinas, backup [quase] automático do conteúdo de pendrive e mídias outras removíveis, acesso aos compartilhamentos de um servidore Netware, entre outros.

O Zenity, é uma ferramenta simples que permite a criação de diálogos para interação com o usuário e permite criar desde uma mensagem dizendo que algo está feito até lista de alternativas para o usuário, ou mesmo um simples editor de textos!

Notificações com libnotify

No caso de scripts que apenas necessitam enviar um aviso, sem interação, nós podemos usar o libnotify que faz nada menos do que notificar o usuário a respeito de algo que esteja ocorrendo.

Certamente você já viu inúmeros programas que o utilizam. Normalmente são mensagens curtas em um box simpático e discreto exibido no canto superior direito da tela.

Usuários do Ubuntu, com Gnome, certamente já se habituaram com ela ao receber uma mensagem de algum contato no Empathy, ou quando a conexão de rede cai, recebe email no Evolution etc.

A libnotify, faz parte do projeto Galago [1] cuja intenção é criar um framework para notificação no desktop e que pode  ser usado em qualquer ambiente usando o protocolo D-BUS [2].

Notificações em shellscript

Para usar a libnotify em scripts nós não precisamos nos preocupar com API, sintaxes para comunicação DBUs e nem nada complicado. Há um simples comando (notify-send) que pode ser evocado via linha de comandos sem muito mistério.

Sua sintaxe é simples de ser lembrada:

notify-send <Título> <Mensagem>

Considerando que <Mensagem> é opcional, você pode seguramente usá-lo (com moderação é claro) no lugar de alguns “echo” do seu shellscript.

Caso este comando não esteja disponível em seu sistema instale o pacote “libnotify-bin” (considerando as distribuições Debian e Ubuntu) e este problema estará resolvido.

Notify-send na prática

Uma demonstração do uso da libnotify poderia ser feito usando o exemplo de script para downloads que mostrei no texto “Estendendo o poder de trabalho do Nautilus“.

O script em si é bem simples e é executado quando o usuário clicar com o botão direito do mouse em uma pasta no Nautilus. Isso faria o zenity exibir uma caixa pedindo a URL a ser baixada e então o arquivo seria salvo na dita pasta.

O seu código, que é bem mediocre, é exatamente o que está transcrito abaixo (Não deixe de ler o artigo citado para entender a sua utilidade):

#!/bin/bash
URL=$(zenity --entry --text "Informe a URL do arquivo a ser baixado")
wget "${URL}"

Como se vê ele é bem simples e considerando que o usuário informou a URL e clicou no botão OK ele não saberá se o arquivo foi baixado e nem quando, a menos que fique olhando o conteúdo da pasta.

Para melhorarmos este script poderíamos informar ao usuário quando o download do arquivo fosse concluído. Isso pode ser feito com apenas uma linha adicional. Compare a listagem anterior com a seguinte:

#!/bin/bash
URL=$(zenity --entry --text "Informe a URL do arquivo a ser baixado")
wget "${URL}"
notify-send "Download finalizado" "O arquivo requisitado ${URL} terminou de ser baixado."

Observe que apenas acrescentei uma linha ao final da listagem original, desta forma o usuário receberá um aviso quando o arquivo for baixado.

A hora do café x panela no fogo

Imagine um nerd cozinhando! Não creio que ele ficará parado na cozinha esperando que uma panela no fogo termine de cozinhar a sua refeição, afinal de contas ele já deve ter ouvido várias vezes o aviso do msn uma dez vezes ou mais informando que alguém está desesperado querendo falar com ele sobre o último episódio de sua série de TV favorita.

Vamos considerar então que este “nerd cozinheiro” largou tudo na cozinha e foi consultar seus e-mails no escritório. Como ele sabe que vai se empolgar e pode acabar esquecendo o que estava fazendo na cozinha, antes de abrir o seu cliente de e-mails ele emite os dois comandos a seguir no terminal:

sleep 2m && notify-send "O café está pronto" "Sirva-se e aproveite para relaxar"
sleep 8m && zenity --info --title="O arroz está pronto" --text "Desligue o registro de gás antes que queime"

Eles apenas esperam o número de minutos informado ao comando sleep e então emitem a mensagem pré-definida. Mas perceba que no primeiro eu usei o notify-send enquanto no segundo usei a função “–info” do zenity.

O porque é simples de ser entendido. O notify-send exibe uma mensagem que após alguns segundos desaparecerá para sempre. Neste caso informar que o café está pronto é um aviso que não tem importância se passar despercebido para o nosso amigo “nerd cozinheiro”.

O café já está pronto e nada mais acontecerá por isso, a cafeteira fica lá quietinha na dela sem incomodar e mesmo que o nerd não veja a mensagem e só volte daqui a duas horas tudo continuará lá e sem problemas.

O segundo caso é  problemático. Caso o nerd não veja a mensagem e tome medidas imediatas ele poderá queimar todo o seu arroz e talvez até causar um acidente, por isso optei por usar o zenity que mostra a mensagem e a mantém na tela até que o usuário a veja e clique OK.

Sempre que tiver que decidir entre um e outro então lembre-se desta ilustração. Se é só um aviso sem muita importância use o notify-send, se é importantíssimo que o usuário veja a mensagem use o “zenity”.

Considerações finais

O comando notify-send possui alguns parâmetros que poderão ser úteis em seus scripts, neste caso não deixe de consultar a página do manual (man notify-send) para conhecê-los e usá-los, se necessário for.

Veja também que a notificação realizada pelo libnotify é temporária e caso o usuário não a veja no momento em que ela foi exibida, não terá como fazê-lo depois.

Caso você precise que o usuário realmente veja a mensagem, mesmo muito tempo depois, o melhor seria usar o zenity já demonstrado em outros textos. Não deixe de consultar os links apresentados no artigo e nas referências para conhecê-lo.

Referências

[1] Galago Project. Disponível em <http://www.galago-project.org>.

[2] FreeDesktop. D-BUS. Disponível em <http://dbus.freedesktop.org/>

3 comentários em “Notificação em modo gráfico para shellscript”

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.