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_exit
funció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 -e
hará 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