Redirigir el eco en la función de captura a la salida estándar

Redirigir el eco en la función de captura a la salida estándar

Actualmente tengo problemas para imprimir las declaraciones de eco en mi función de captura en la salida estándar. Estoy redirigiendo todos los resultados (error y salida estándar) a un archivo de registro desde un comando que ejecuto. Pero si aparece un error, quiero que el error se redirija nuevamente a la salida estándar en lugar del archivo de registro.

Estaba pensando en hacer algo como trap 1> on_exit EXIT. Pero no tengo idea sobre eso. ¿Cómo debería hacer esto?

Editar: Como aclaración, estoy redirigiendo deliberadamente TODA la salida (stderr y stdout) a un archivo de registro. Si en CUALQUIER punto hay un error, la salida de ese error de ese comando se coloca en el registro (que es lo que quiero), Y quiero que la on_exitfunción salga a la vista del usuario (stdout) en lugar del archivo de registro. Mi secuencia de comandos actualmente tiene esa función de captura que se envía al archivo de registro. Solo quiero que se envíe a la salida estándar.

#!/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 "$@"

Respuesta1

[esto es más un comentario que una respuesta; no está muy claro lo que estás tratando de lograr]

Esto set -ehará que su secuencia de comandos se cierre ante un error, por lo que es demasiado tarde para redirigir algo.

Quizás buscas algo como esto:

#! /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

al ejecutarlo:

$ 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

El script de OP se modificó para imprimir un mensaje en el stderr original y salir ante un error:

#!/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 "$@"

al ejecutarlo:

$ 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

información relacionada