Eu não consegui fazer a linha 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 erro padrão & padrão para o script inteiro. Como assim: exec > $LOGFILE 2>&1
Isso irá mostrar stderr e stdout para $ LOGFILE.
Agora, desde que você queira que isso seja exibido no console, bem como um arquivo de log, você também terá que usar um pipe nomeado para que o exec grave e tee para ler.
(O one-liner de Dennis faz isso tecnicamente também, embora obviamente de uma maneira diferente) O próprio pipe é criado com mkfifo $PIPEFILE
. Então faça o seguinte.
# Start tee writing to a logfile, but pulling its input from our named pipe. tee $LOGFILE < $PIPEFILE & # capture tee's process ID for the wait command. TEEPID=$! # redirect the rest of the stderr and stdout to our named pipe. exec > $PIPEFILE 2>&1 echo "Make your commands here" echo "All their standard out will get teed." echo "So will their standard error" >&2 # close the stderr and stdout file descriptors. exec 1>&- 2>&- # Wait for tee to finish since now that other end of the pipe has closed. wait $TEEPID
Se você deseja ser minucioso, pode criar e destruir o arquivo de pipe nomeado no início e no final do script.
Para o registro, eu peguei a maior parte deste post muito informativo de um cara aleatório: (Arquivado a versão )