我希望它如何工作:
- 如果没有错误被 bash 捕获(如果没有返回非零退出代码 [除非被 || true 覆盖]),请保持沉默。隐藏标准输出和标准错误。
- 当错误被 bash 捕获时,要详细。编写标准输出和标准错误。
在我的脚本中,只有 stdout 和 stderr 丢失了。
#!/bin/bash
exec 5>&1 >/dev/null
exec 6>&2 2>/dev/null
error_handler() {
local return_code="$?"
local last_err="$BASH_COMMAND"
local stdout= # How to read FD 5?
local stderr= # How to read FD 6?
exec 1>&5
exec 2>&6
echo "ERROR!
scriptname: $0
BASH_COMMAND: $last_err
\$?: $return_code
stdout: $stdout
stderr: $stderr
" 1>&2
exit 1
}
trap "error_handler" ERR
echo "Some message..."
# Some command fails, i.e. return a non-zero exit code.
mkdir
我可能会将 stdout/stderr 重定向到一个临时文件并使用 cat 来显示它,以防错误被 bash 捕获。如果不需要该临时文件,会更好一些。任何想法?
信用:这个问题的灵感来自问题How to undo exec > /dev/null in bash? 查尔斯·达菲回答