Você poderia redirecionar stderr
para uma substituição de processo que processa stderr
e envia as linhas processadas para o log.
Por exemplo, esse script imprimirá 5 linhas para stdout
e 5 linhas para stderr
, redirecionando stderr
para uma susbstitution de processo que processa stderr
e envia as linhas processadas para um arquivo chamado "log" em o diretório de trabalho atual (lembre-se de que a sintaxe para redirecionar stderr
é exec 2> [...]
, não 2> [...]
):
#!/bin/bash
exec 2> >(perl -pe '$x='date "+%d %b %Y %H:%M %p"';chomp($x);$_=$x." ".$_' >log)
for i in {1..5}; do
sleep 1
echo "STDOUT message #$i"
echo "STDERR message #$i" >&2
done
exit 0
A substituição do processo invoca o Perl, que acrescenta a data e a hora atuais nesse formato a cada linha e as envia para um arquivo chamado "log" no diretório de trabalho atual.
% bash script.sh
STDOUT message #1
STDOUT message #2
STDOUT message #3
STDOUT message #4
STDOUT message #5
% cat log
02 Nov 2015 20:15 PM STDERR message #1
02 Nov 2015 20:15 PM STDERR message #2
02 Nov 2015 20:15 PM STDERR message #3
02 Nov 2015 20:15 PM STDERR message #4
02 Nov 2015 20:15 PM STDERR message #5