quinta-feira, maio 17, 2007

Logando de forma eficiente em shell

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

(surrupiado do codare)