我有一个辅助功能:
function error_exit
{
/opt/aws/bin/cfn-signal ...
exit 1
}
该辅助函数用于发出错误信号。这是一个用法示例:
/opt/aws/bin/cfn-init -s .. || error_exit 'Failed to run cfn-init'
该cfn-init
命令需要很多与问题无关的参数。当命令返回非空值并且可能向错误输出返回错误消息时,我想获取错误消息并将其error_exit
作为参数包含到方法中。这可能吗?如果没有,您将如何在 bash 中实现一个帮助器方法来获取源错误消息?
答案1
您可以将错误输出重定向到文件,然后检索该输出:
trap "rm -f /tmp/cfn-error.txt" 0 1 2 3 15
/opt/aws/bin/cfn-init -s ... 2>/tmp/cfn-error.txt ||
error_exit $(</tmp/cfn-error.txt)
您应该始终清理混乱,因此不要忘记删除您创建的任何临时文件。
答案2
您还可以通过重定向来执行此操作:
# run_cmd 'error message' cmd -foo "${params[@]}"
run_cmd() {
local e r m=$1
shift
exec 6>&1
e=$("$@" 2>&1 >&6)
r=$?
exec 6>&-
((r)) || return 0
error_exit "$m" "$e"
}
所以你会使用:
run_cmd 'Failed to run cfn-init' /opt/aws/bin/cfn-init -s ..
该行: e=$("$@" 2>&1 >&6) 首先将 stderr 定向到 stdout,在 $(..) 的上下文中,它是我们正在捕获的输出。然后 stdout 被定向到我们启动该函数时它最初所在的位置。
当然,您可以使 error_exit 额外获取退出状态,并使用例如: error_exit "$m" "$r" "$e" 来调用它