No momento, estou tendo problemas para fazer com que as instruções de eco em minha função trap sejam impressas no stdout. Estou redirecionando todas as saídas (erro e stdout) para um arquivo de log de um comando que executo. Mas se ocorrer um erro, quero que o erro seja redirecionado de volta para stdout em vez do arquivo de log.
Eu estava pensando em fazer algo parecido trap 1> on_exit EXIT
. Mas não tenho ideia disso. Como devo fazer isso?
Editar:
Como esclarecimento, estou redirecionando propositalmente TODAS as saídas (stderr e stdout) para um arquivo de log. Se em QUALQUER ponto houver um erro, a saída desse erro desse comando é colocada no log (que é o que eu quero), E eu quero que a on_exit
saída da função seja exibida na visualização do usuário (stdout) em vez do arquivo de log. Atualmente, meu script tem essa função trap sendo enviada para o arquivo de log. Eu só quero que seja enviado para stdout.
#!/usr/bin/env bash
set -e
on_exit()
{
echo "An error occurred"
}
function main()
{
trap on_exit EXIT
# for looping over set of commands
$command &> "$LOGFILE"
}
main "$@"
Responder1
[isto é mais um comentário do que uma resposta; não está muito claro o que você está tentando alcançar]
Isso set -e
fará com que seu script seja encerrado após um erro, então é tarde demais para redirecionar qualquer coisa.
Talvez você esteja atrás de algo assim:
#! /bin/bash
set -o errtrace # let functions inherit the ERR trap
exec 3>&2 # save the original stderr into fd 3
on_error() {
echo >&2 "An error occurred" # still printed to the log the 1st time
exec 2>&3 # switch back to the original stderr
trap '' ERR # disable ourselves
}
main() {
trap on_error ERR
no_such_command # this fail with an error
no_such_command # again
no_such_command # and again
}
main "$@" >/tmp/log 2>&1
ao executá-lo:
$ bash /tmp/err
/tmp/err: line 13: no_such_command: command not found
/tmp/err: line 14: no_such_command: command not found
$ cat /tmp/log
/tmp/err: line 12: no_such_command: command not found
An error occurred
Script do OP modificado para imprimir uma mensagem no stderr original e sair após um erro:
#!/usr/bin/env bash
set -o errtrace # let functions inherit the ERR trap
exec 3>&2 # save the original stderr
on_error()
{
echo >&3 "An error occurred"
exit 1
}
function main()
{
trap on_error ERR
# for looping over set of commands
$command &> "$LOGFILE"
}
main "$@"
ao executá-lo:
$ command=no_such_command LOGFILE=/tmp/log bash /tmp/jeg
An error occurred
$ cat /tmp/log
/tmp/jeg: line 15: no_such_command: command not found