Como enviar a saída para a tela e para o correio?

9

Eu uso o seguinte para enviar um email no final de um script.

echo "Script finished on `date`" | /usr/bin/Mail -s "Script complete" "[email protected]".

No entanto, quero ecoar a mesma mensagem na tela também. Como faço isso na mesma declaração?

sammy
fonte

Respostas:

19

A maneira mais fácil é provavelmente teea mensagem para stderr e stdout:

echo "Script finished on date" | tee /dev/stderr \
    | /usr/bin/Mail -s "Script complete" "[email protected]"

teeduplica sua entrada para vários destinos, incluindo stdout. Por padrão, stderr e stdout vão para a tela; você está redirecionando o stdout para Mail, deixando apenas o stderr indo para a tela.

Se você precisar dele no stdout por algum motivo, poderá redirecioná-lo novamente usando um subshell (ou várias outras maneiras):

(
    echo "Script finished on date" | tee /dev/stderr \
        | /usr/bin/Mail -s "Script complete" "[email protected]"
) 2>&1
derobert
fonte
3
alternativamente, coloque tee em um arquivo e envie-o por correio ... muito útil se a saída for grande e você desejar enviá-lo, por exemplo, como um anexo MIME compactado com gzip codificado em base64. ou apenas redirecione toda a saída para um arquivo (por exemplo, com exec &> $LOGFILE) e restaure o stdout, coloque o arquivo em stdout e envie-o por correio.
cas
Obrigado craig. Como meu texto neste caso é muito pequeno, irei com a resposta de derobert.
sammy
Hmm .. isso funcionou, mas percebi que precisava adicionar mais à descrição do meu problema. Eu usei essa solução como a última linha do meu script. Eu usei um comando "nohup" no meu script para coletar toda a saída do meu script como "nohup.out" e tudo o que vejo é apenas essa linha "Script concluído em xxxxx". Antes de usar esta solução, obtive toda a saída do script corretamente. Existe uma maneira de acrescentar a saída desta última linha em vez de apagar tudo?
sammy
11
O uso de "tee -a" resolveu o problema.
sammy