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>
.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários