Перенаправить эхо в функции ловушки обратно в stdout

Перенаправить эхо в функции ловушки обратно в stdout

В настоящее время у меня возникла проблема с выводом операторов echo в моей функции trap на stdout. Я перенаправляю весь вывод (error и stdout) в файл журнала из команды, которую я запускаю. Но если возникает ошибка, я хочу, чтобы ошибка была перенаправлена ​​обратно на stdout вместо файла журнала.

Я думал просто сделать что-то вроде trap 1> on_exit EXIT. Но у меня нет идей по этому поводу. Как мне это сделать?

Редактировать: В качестве пояснения, я намеренно перенаправляю ВЕСЬ вывод (stderr и stdout) в файл журнала. Если в ЛЮБОЙ точке возникает ошибка, вывод этой ошибки этой команды помещается в журнал (чего я и хочу), И я хочу, чтобы функция on_exitвыводила в представление пользователя (stdout) вместо файла журнала. В моем скрипте в настоящее время эта функция ловушки выводится в файл журнала. Я просто хочу, чтобы она отправлялась в 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 "$@"

решение1

[это скорее комментарий, чем ответ; не совсем понятно, чего вы пытаетесь добиться]

Это set -eприведет к завершению работы скрипта из-за ошибки, поэтому перенаправлять что-либо будет уже слишком поздно.

Возможно, вам нужно что-то вроде этого:

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

при запуске:

$ 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

Скрипт OP изменен для вывода сообщения в исходный stderr и выхода при возникновении ошибки:

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

при запуске:

$ 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

Связанный контент