将陷阱函数中的回显重定向回标准输出

将陷阱函数中的回显重定向回标准输出

我目前在将陷阱函数中的 echo 语句打印到标准输出时遇到问题。我将所有输出(错误和标准输出)从我运行的命令重定向到日志文件。但如果遇到错误,我希望将错误重定向回标准输出而不是日志文件。

我正在考虑做类似的事情trap 1> on_exit EXIT。但我对此一无所知。我该怎么做?

编辑: 作为澄清,我故意将所有输出(stderr 和 stdout)重定向到日志文件。如果在任何时候出现错误,该命令的错误输出都会放入日志中(这就是我想要的),并且我希望将函数on_exit输出到用户视图(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

相关内容