Redirecionar o eco na função trap de volta para stdout

Redirecionar o eco na função trap de volta para stdout

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_exitsaí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 -efará 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

informação relacionada