você está aqui: Home  → Arquivo de Mensagens Workshop Gratuito sobre Programação Shell Linux

Uma dica do notify-send

Colaboração: Julio Cezar Neves

Data de Publicação: 07 de abril de 2020

Ainda temos vagas com desconto para a próxima turma do curso Programação Shell Linux, com o Prof. Julio Neves.

Saiba mais e faça sua inscrição


Uma dica do notify-send

Vou dar uma explicação rapidinha sobre a sintaxe do notify-send, que caso não esteja instalado no seu computador, você pode fazê-lo com a seguinte linha (para Debian e seus correlatos):

$ sudo apt-get install libnotify-bin

Bem a sintaxe é a seguinte:

notify-send [OPCOES...]  [TEXTO]

Um exemplo bem bobo passando somente o título TITULO:

$ notify-send "Alô Mundo"

Fazendo isso aparecerá no canto superior esquerdo da tela a seguinte figura:

Mas poderíamos também preencher o TEXTO:

$ notify-send "Alô Mundo" "Cheguei e trouxe o notify"

Podemos também colocar um ícone:

$ notify-send "Alô Mundo" "Cheguei e trouxe o notify" \
      -i gtk-dialog-info

Para ver a relação dos principais ícones (especiais para o notify-send) faça:

$ ls /usr/share/notify-osd/icons/Humanity/scalable/status/
$ ls /usr/share/notify-osd/icons/hicolor/scalable/status/

Também podemos usar o notify-send para criar um script para ser um disparador de jobs em background que manda um aviso em seu término. Veja como:

$ cat dispara_job.sh
#!/bin/bash 
#  Avisa o término de um job, usando notification-send .
#  Esse script deverá ser executado em background

eval "$1" 
notify-send -i terminal "Acabou" "\nFim do job $1"

Para testá-lo use algo como:

$ dispara_job.sh 'time find / > /dev/null 2>&1' &

Assim você lerá em background (&) o nome de todos os arquivos de seu computador mandando a saída primária (stdout) para o buraco negro (> /dev/null) e a saída de erros (stderr) também (2>&1). Ele também funciona em foreground, mas aí não te traria vantagem alguma, pois seu terminal ficaria preso até que ele terminasse.

Se quiser, ainda é possível temporizar o tempo de exibição, com a opção -t N (onde N é em milisegundos)

$ notify-send "Alô Mundo" "Cheguei e trouxe o notify" \
      -i gtk-dialog-info -t 10000

Ainda existem outras opções que não exploraremos, evitando que este artigo se torne muito extenso. Abaixo uma tabela com o resumo dessas opções, que espero que você se aprofunde, já que este utilitário é muito útil, podendo inclusive passar avisos sobre eventos tais como alterações no volume, chegada de e-mail, instant messages, eventos de rede, ... Você encontrará todos os detalhes aqui.

Opções Ações
-u NIVEL Especifica o nível de urgência (low, normal, critical)
-c TIPO[,TIPO...] Especifica a categoria da notificação
-h TIPO:NOME:VALOR Especifica base de dados extra para passar. Os tipos válidos são int, double, string e bytes
$ cat notify1.sh
#!/bin/bash
#  Executa um comando dando a resposta num
#+ balão do tipo notify-send. Ideal para
#+ usar com +F2, sem abrir um terminal
#+ Thanks Karthik

Saida=$(eval "$*" 2>/dev/null) || {
    zenity --error --text \"Comando \"$*\" errado\"
    exit 1
}
notify-send -t $((1000+300*$(echo -n $Saida |\
    wc -w))) -u low -i gtk-dialog-info "$*" "$Saida"

Se você não quiser abrir um terminal para executar um comando, basta você usar este programa. Como fazê-lo? É simples: após colocar este script no seu diretório home, pressione <ALT>+F2 que aparecerá a caixa "Executar aplicativo". Nesta caixa digite o nome do script (no caso notify1.sh) seguido do comando que você deseja executar e que terá sua saída apresentada em um menu pop-up gerado pelo notify-send.

Repare que foi feito um algebrismo para se dilatar o tempo de exibição de acordo com a quantidade de palavras em $Saída (1 segundo inicial, acrescido de 0,3 de segundo por palavra). Vejamos sua utilização para o comando who -b que informa a data e hora do último boot.


A imagem não é bem esta que mostrei, pois o <ALT>+F2 bloqueia a tela, não permitindo sequer que se faça uma cópia da janela por ele criada.

Vamos ver um programa para verificar a carga da bateria de seu notebook.

$ cat notify2.sh
#!/bin/bash
# Para pegar a carga da bateria
Carga=$(acpi -b | sed 's/.* //;s/%//')
#  Criando o índice do ícone já que o nome do
#+ ícone é no formato notification-battery-xxx
#+ e xxx deve ser 000, 020, 040, 060, 080,
#+ ou 100, dependendo da carga da bateria
Nivel=$(case $Carga in
    ([01][0-9]) echo 000;;
    ([23][0-9]) echo 020;;
    ([45][0-9]) echo 040;;
    ([67][0-9]) echo 060;;
    ([89][0-9]) echo 080;;
            (*) echo 100;;
esac)
notify-send -i notification-battery-$Nivel "Bateria" \
    "\nO nível de carga da bateria está em $Carga%"

Com o mesmo acpi, podemos obter informações sobre o estado físico da bateria do seu notebook, isto é quanto de carga ela ainda suporta. Veja essa linha de comandos:

$ acpi -i | sed -r 's/(.*)/"\1"/' |
    xargs notify-send -i /usr/share/icons/Mint-X/devices/48/battery.svg

Foi assim que descobri que a vida útil da bateria do meu notebook já tinha diminuído 29%, já que ela só está aceitando 71% da carga.

Veja o que acontece quando e executamos somente a primeira parte do comando:

$ acpi -i | sed -r 's/(.*)/"\1"/'
"Battery 0: Full, 100%"
"Battery 0: design capacity 5880 mAh, last full capacity 4200 mAh=71%"

E desta forma podemos ver que o sed foi utilizado para colocar as aspas nas duas linhas de texto, para que elas agissem como os 2 parâmetros que o notify-send precisa.

Veja como é a saída do acpi -b, que é quem me informa a carga reminiscente na bateria:

$ acpi -b
Battery 0: Unknown, 98% 

O sed foi usado para limpar essa saída, deixando somente o 98.

Experimente fazer um script para pegar a temperatura de seu notebook. Para fazer isso, use o seguinte comando:

$ acpi -t
Thermal 0: ok, 29.8 degrees C
Thermal 1: ok, 46.0 degrees C

MUITO IMPORTANTE: Este artigo foi escrito usando Debian e Linuxmint, mas os ícones variam muito de uma distro para outra e até de uma versão para a outra da mesma distro. Assin sendo, pode ser (e é provável) que alguns destes ícones não apareçam para você. A melhor forma de localizá-los é usando um find, procurando uma palavra chave a partir de /usr/share/icons ou a partir dos diretórios que abordei ao longo do texto deste artigo. Por exemplo, para procurar ícones de touchpad faça:

$ find /usr/share/icons -name "*touchpad*"


Veja a relação completa dos artigos de Julio Cezar Neves