De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Rubens Queiroz de Almeida
Data de Publicação: 20 de fevereiro de 2018
O envio de mensagens de email para múltiplos destinatários pode ser automatizado por meio de um programa em Shell muito simples.
O primeiro passo é montar o cabeçalho da mensagem, que deve conter, no
mínimo, o nome do destinatário (To:), o nome do remetente (From:)
e o assunto da mensagem (Subject:). Como exemplo, vamos utilizar uma
versão resumida da primeira mensagem da Dicas-L, enviada no dia 3 de março
de 1997 (já faz um tempinho, né?)
while read nome email do /usr/sbin/sendmail $email << EOF From: Rubens Queiroz de Almeida <queiroz@dicas-l.com.br> To: user@gmail.com Subject: Receitas de uso do comando find Colaboração: Rubens Queiroz de Almeida Data de Publicação: 03 de Março de 1997 O comando find é extremamente poderoso e flexível para descobrir arquivos que atendem a determinadas especificações. Por exemplo, suponhamos que queiramos descobrir todos os arquivos que não possuem dono em nosso sistema. Esta situação é extremamente comum, visto que usuários são criados e apagados diariamente e ficam vagando pelo sistema e podem eventualmente vir a comprometer a segurança. O comando find / -nouser -print —----------------------------------------------------------------------- As mensagens da Dicas-L são enviadas diariamente para `wc -l lista.txt` assinantes. EOF done < lista.txt
Esta Shell usa um recurso muito útil, o Here Document. Com este
recurso nós podemos fornecer ao programa um trecho de texto, que serão
os dados entregues ao programa especificado, em nosso caso, o programa
sendmail. O programa sendmail irá interpretar como entrada todos os
caracteres que encontrar até que os caracteres EOF sejam encontrados na
primeira posição da linha.
Observe também a seguinte frase:
As mensagens da Dicas-L são enviadas diariamente para `wc -l lista.txt` assinantes.
Uma prática que tenho seguido há vários anos, é sempre inserir no rodapé
das mensagens o número de assinantes da minha lista. No texto, este valor é
inserido como um resultado do comando wc (word count), com a diretiva
-l, que me fornece o número de linhas do arquivo que contém a lista
dos assinantes.
Note que o comando é delimitado por aspas invertidas (que costumam chamar
de crase, apesar de ser um acento grave e não uma crase), o que faz com
que no texto seja inserido o resultado do comando wc -l, pois as crases,
servem para dar prioridade de execução, por exemplo:
Arqs=ls
Dessa forma eu estaria atribuindo o literal ls à variável $Arqs. Se eu quiser
atribuir a saída do comando ls, eu deveria fazer:
Arqs=`ls`
Como em qualquer interpretador as operações são feitas de cima para baixo e da
esquerda para a direita, precisamos dizer ao Shell para ele priorizar o comando
ls e isso se consegue de duas maneiras:
Eu poderia fazer algo semelhante com qualquer comando disponível no sistema. Nesta mesma linha, supondo que este seja um e-mail que eu mande diariamente, eu poderia substituir:
Data de Publicação: 03 de Março de 1997
Por:
Data de Publicação: $(date "+%d de %B de %Y")
No comando date, se houver um sinal de adição (+), tudo que for
precedido por um porcento (%) é considerado um caractere de formatação
de tempo, senão, será considerado um literal e:
| %d | Dia (01-31) |
| %B | Mês por extenso |
| %Y | Ano com século (4 algarismos) |
Uma coisa muito pouco conhecida e que é provável que até você desconheça: 90%
das vezes que usamos Here Document, prejudicamos a indentação porque o
label utilizado (em nosso exemplo usei EOF) não pode ter espaços antes
nem depois, mas o que é segredo de estado é que pode ter <TAB>s antes,
desde que você use um hifen após os sinais de maior (<<-). Experimente fazer:
if ....
then
....
cat <<- Fim
No dia $(date)
meu diretório tinha:
$(ls -l)
Fim
fi
IMPORTANTE: Antes da palavra Fim tem um <TAB>.