É possível obter a mensagem de erro do comando anterior que falhou quando o comando condicional é executado usando ||

5

Eu tenho uma função auxiliar:

function error_exit
{
    /opt/aws/bin/cfn-signal ...
    exit 1
}

Esta função auxiliar é usada para sinalizar um erro. Aqui está um exemplo de uso:

/opt/aws/bin/cfn-init -s .. || error_exit 'Failed to run cfn-init'

O comando cfn-init usa muitos parâmetros que não são relevantes para a pergunta. Quando o comando retorna um valor não nulo e, possivelmente, uma mensagem de erro para a saída de erro, eu gostaria de obter a mensagem de erro e incluí-lo no método error_exit como um parâmetro. Isso é possível? Se não, como você implementaria um método auxiliar no bash que torna possível obter a mensagem de erro de origem?

    
por tronda 20.12.2011 / 12:00

2 respostas

6

Você pode redirecionar a saída de erro para um arquivo e, em seguida, recuperar essa saída:

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)

Você deve sempre limpar sua bagunça, então não se esqueça de excluir qualquer arquivo temporário que você criar.

    
por 20.12.2011 / 13:28
1

Você também pode fazer isso por redirecionamento:

# 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"
}

Então você usaria:

run_cmd 'Failed to run cfn-init' /opt/aws/bin/cfn-init -s ..

A linha: e = $ ("$ @" 2 > & 1 > & 6) primeiro direciona stderr para stdout, que no contexto de $ (..) é a saída que estamos capturando. Então stdout é direcionado para onde originalmente foi quando começamos a função.

Claro, você pode fazer error_exit, adicionalmente, tomar o status de saída, e chamá-lo com, por exemplo: error_exit "$ m" "$ r" "$ e"

    
por 10.01.2012 / 11:50