Este método redireciona stderr para stdout, em seguida, pipes para tee. Eu acho que é um pouco mais legível.
exec 2>&1 | tee log.file
Eu testei isso na minha máquina e não encontrei o problema de "nova linha".
Para gerar saída de stdout e stderr de um script para o console e para um arquivo de log, encontrei uma solução bonita com tee:
exec &> >(tee log.file)
O problema é que às vezes o tee parece estar comendo novas linhas. Por exemplo, eu tenho uma armadilha na saída que imprime uma nova linha e só então sai.
trap "echo && exit 55" EXIT HUP INT QUIT KILL
Faz com que o shell imprima o prompt da nova linha, em vez de onde o usuário pode ter pressionado ^C
enquanto o script estava sendo executado. E isso não funciona quando há uma chamada para exec.
tee
está provavelmente sendo morto pelo sinal antes de receber a nova linha.
Tags bash tee exec io-redirection