Você já tentou isso?
rsync -av blah blah 2>&1|perl -e "while(<>){s/^/'date' /g; print;}" >>logfile
Ele adicionará a data e alguns espaços ao início da linha.
Eu tenho um problema com um script de shell que usa o rsync para sincronizar 2 diretórios. Estou armazenando o resultado do comando rsync (seja ele bem-sucedido ou não) em um arquivo denominado status e, no caso de haver um problema, a saída stderr é anexada a um arquivo denominado error. No entanto, parece que não consigo encontrar uma maneira de inserir um registro de data e hora antes do erro real no arquivo de erros.
No final, preciso de algo assim:
if rsync source destination 2>> error # but I need to have the date before the actual error is appended!
then
echo "'date' - Success" >> status
else
echo "'date' - Failure" >> status
fi
Eu também tentei o seguinte:
(rsync source destination && echo "'date' - Success" >> status || echo "'date' - Failure" >> status) 2>>error
A única maneira de fazer isso funcionar é quando eu armazeno a saída stderr em um arquivo temporário, para que eu possa anexar seu conteúdo ao arquivo de erro depois que eu inserir o registro de data e hora.
Eu sei que faz mais de três meses desde que fiz esta pergunta, mas achei que seria bom mostrar o que acabei fazendo no meu shell script.
Como eu descrevi, eu precisava de alguma forma pegar o stderr, para manipulá-lo em um arquivo de log, por exemplo. adicione um timestamp. Consegui fazer isso usando arquivos e com o que Patrick sugeriu, mas queria mantê-lo o mais simples possível.
Então, foi assim que eu trabalhei:
if ! result=$(command_that_will_produce_errors 2>&1 1>/dev/null)
then
echo "There was an error on $(date): $result" >> logfile
else
echo "Command executed successfully on $(date)" >> logfile
fi
O Wiki de Greg tem uma entrada em adição de carimbos de hora a cada linha de um fluxo que abrange vários métodos, dependendo do seu ambiente . Todos eles baixam o fluxo através de um loop / processo que adiciona os timestamps; a versão compatível com POSIX é:
while IFS= read -r line; do
echo "$(date +%Y%m%d-%H:%M:%S) $line"
done
Tags bash io-redirection