我目前在将陷阱函数中的 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