Shell: Agrupar comandos para log

Palavras-chave: Shell, agrupar, redirecionamento

Ao fazer log da execução de um programa ou compor um arquivo de texto que agrupe a saída de vários comandos, é comum ver a seguinte estrutura ser utilizada:

comando-1 >> arquivo
comando-2 >> arquivo
comando-3 >> arquivo

Tudo bem, isso funciona. Mas há uma maneira mais prática e eficiente de se fazer o mesmo, que é agrupar todos os comandos e redirecioná-los para o arquivo de log uma única vez:

(comando-1 ; comando-2 ; comando-3) >> arquivo

Basta colocar todos os comandos dentro de um par de parênteses para que o shell os encare como um grupo único.

Veja um exemplo da aplicação dessa técnica e perceba uma outra vantagem: o script fica mais legível.

Log Ineficiente

echo "Iniciando em $(date)" >> /tmp/log.txt
rm -vr /tmp/becape/* >> /tmp/log.txt
~/bin/meu-becape.sh --tudo >> /tmp/log.txt
echo "Tamanho do becape: $(du -hs /tmp/becape)" >> /tmp/log.txt
echo "Terminado em $(date)" >> /tmp/log.txt

Log Eficiente

(
echo "Iniciando em $(date)"
rm -vr /tmp/becape/*
~/bin/meu-becape.sh --tudo
echo "Tamanho do becape: $(du -hs /tmp/becape)"
echo "Terminado em $(date)"
) >> /tmp/log.txt
This entry was posted in Shell. Bookmark the permalink.

2 Responses to Shell: Agrupar comandos para log

  1. eita q esse me valeu a pena Aurélio, boa.

  2. Alex Marques says:

    Olá pessoal!
    Uma outra forma muito interessante é utilizar o comando exec:

    LOG=”/tmp/log.txt”
    exec 1>>$LOG
    exec 2>&1
    echo “Iniciando em $(date)”
    rm -vr /tmp/becape/*
    ~/bin/meu-becape.sh –tudo
    echo “Tamanho do becape: $(du -hs /tmp/becape)”
    echo “Terminado em $(date)”

    Pronto, assim teremos toda a execução, stdout (exec 1>>$LOG) e stderr (exec 2>&1), no arquivo de log.

    Abs a todos.

Leave a Reply

Your email address will not be published. Required fields are marked *