enviar para registrar e exibir no console

1

Eu tenho um pequeno script de teste aqui, ele tem tratamento de erros. Gostaria que todos os STDERR e STDOUT fossem exibidos no console (que atualmente são) E transformados em um arquivo de log.

#!/bin/bash

# error handling
function error_handler() {
  echo "Error occurred in script at line: ${1}."
  echo "Line exited with status: ${2}"
}

trap 'error_handler ${LINENO} $?' ERR

set -o errexit
set -o errtrace
set -o nounset

if rsync -aPh ~/Downloads/Temps-linux-x64.zip .; then
        echo "SUCCESSFULL rsync of files"
else
        echo "FAILED rsync of files"
fi

Eu tentei capturá-lo adicionando isso ao início;

exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1

mas isso (como deveria) registra tudo, mas não tem saída para o console. Também está fazendo com que o tratamento de erros não funcione corretamente, por isso preciso de outra solução.

eekfonky
fonte

Respostas:

2

Você pode usar o redirecionamento de descritor para um coproc

#!/bin/bash 
exec 3<&1
coproc mytee { tee log.out >&3;  }
exec >&${mytee[1]} 2>&1

... your script ...

STDOUT e STDERR serão mesclados na saída do script. Seria bom alguém encontrar uma maneira de mesclá-los no arquivo de log, mas separados na saída.

Emmanuel
fonte
0

Use tee:

./script 2>&1 | tee log.out

teecopia entrada padrão para saída padrão e para qualquer arquivo especificado; no exemplo acima, isso é log.out. Para mais informações, consulte man tee.

pfnuesel
fonte
Obrigado, existe uma maneira de incorporá-lo ao script?
eekfonky
@eekfonky Você pode adicionar o mesmo comando no final de suas echodeclarações.
precisa saber é o seguinte