当条件命令使用 || 运行时,是否可以从先前失败的命令获取错误消息

当条件命令使用 || 运行时,是否可以从先前失败的命令获取错误消息

我有一个辅助功能:

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" 来调用它

相关内容