||를 사용하여 조건부 명령을 실행할 때 이전에 실패한 명령에서 오류 메시지를 얻을 수 있습니까?

||를 사용하여 조건부 명령을 실행할 때 이전에 실패한 명령에서 오류 메시지를 얻을 수 있습니까?

도우미 기능이 있습니다.

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명령에는 문제와 관련이 없는 많은 매개변수가 필요합니다. 명령이 null이 아닌 값을 반환하고 오류 출력에 오류 메시지가 나타날 수 있는 경우 오류 메시지를 가져와 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"

관련 정보