Eu não conseguia fazer o one-liner muito simples de Dennis funcionar, então aqui está um método muito mais complicado. Eu tentaria o primeiro dele.
Como mencionado, você pode usar exec para redirecionar o erro padrão e o padrão para o script inteiro. Assim:
exec > $LOGFILE 2>&1
Isso produzirá todos os stderr e stdout para $ LOGFILE.
Agora, como você deseja que isso seja exibido no console e também em um arquivo de log, você também precisará usar um pipe nomeado para o exec escrever e o tee para ler.
(O one-liner de Dennis tecnicamente também faz isso, embora obviamente de uma maneira diferente). O pipe em si é criado mkfifo $PIPEFILE
. Então faça o seguinte.
# Comece escrevendo tee em um arquivo de log, mas retirando sua entrada do nosso pipe nomeado.
tee $ LOGFILE <$ PIPEFILE &
# capture o ID do processo do tee para o comando wait.
TEEPID = $!
# redireciona o restante do stderr e stdout para o nosso pipe nomeado.
exec> $ PIPEFILE 2> & 1
eco "Faça seus comandos aqui"
eco "Todos os seus padrões serão atendidos."
eco "O erro padrão deles também será>" & 2
# fecha os descritores de arquivo stderr e stdout.
exec 1> & - 2> & -
# Aguarde o tee terminar, pois agora a outra extremidade do tubo foi fechada.
aguarde $ TEEPID
Se você quiser ser completo, poderá criar e destruir o arquivo de pipe nomeado no início e no final do seu script.
Para constar, eu colhi a maior parte disso no post muito informativo de um cara aleatório: ( Versão arquivada )