bash 변수에 psql 오류 메시지 출력을 저장하는 방법은 무엇입니까?

bash 변수에 psql 오류 메시지 출력을 저장하는 방법은 무엇입니까?

여러 가지 다른 psql 문을 실행하는 스크립트가 있습니다. 입력한 비밀번호가 올바르지 않을 때 psql의 오류 출력을 캡처하려고 합니다. 확인하기 전에 비밀번호를 입력하세요(올바르면 psql 문이 성공적으로 실행됩니다).

나는 다음을 시도했습니다 :

pwcheck=`psql -q -U postgres -h $ip -d $database;`
echo "error message: $pwcheck"

확인을 위해 잘못된 비밀번호를 입력하면 오류 메시지가 출력되지만 변수가 비어 있습니다.

psql: FATAL:  password authentication failed for user "postgres"
FATAL:  password authentication failed for user "postgres"
error message:

이상적으로는 오류 메시지/프롬프트를 인쇄하는 대신 오류 메시지를 변수에 저장하고 싶습니다.아니요psql 오류 전체를 표시합니다.

이러한 오류 메시지를 bash 변수에 어떻게 저장할 수 있습니까?

답변1

직접적으로 말할 수는 없습니다. 적어도 표준 출력과 혼합하거나 표준 출력을 폐기하지 않고서는 안됩니다. 그러나 방법이 있습니다!

#!/bin/bash
errorlog=$(mktemp)
trap 'rm -f "$errorlog"' EXIT
pwcheck="$(psql -q -U postgres -h $ip -d $database 2> "$errorlog")"
if [[ 0 -ne $? ]]; then
    echo "Something went wrong; error log follows:"
    cat "$errorlog"
fi

답변2

이는 stdout 및 stderr을 캡처하지만 종료 코드를 숨깁니다.

$ output=$(psql -c "select xow()" 2>&1 | cat)
$ echo $?
0
$ echo "$output"
ERROR:  function xow() does not exist
LINE 1: select xow()
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
$ 

여기에는 캡처된 출력의 종료 코드가 포함됩니다.

$ output=$({ psql -c "select xow()" 2>&1; echo rc=$?; } | cat)
$ echo $?
0
$ echo "$output"
ERROR:  function xow() does not exist
LINE 1: select xow()
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
rc=1
$ 

psql 명령이 실패하면 0이 아닌 종료 코드가 반환됩니다. 참고: 이는 psql이 아닌 grep의 종료 코드입니다. 이 경우 값은 동일하지만 이는 단지 우연일 뿐입니다.

$ output=$( output=$({ psql -c "select xow()" 2>&1; echo rc=$?; } | cat); echo "$output" | grep 'rc=0'; rc2=$?; echo "$output"; exit $rc2 )
$ echo $?
1
$ echo "$output"
ERROR:  function xow() does not exist
LINE 1: select xow()
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
rc=1
$

성공적인 psql 명령의 경우 0으로 종료하는 것은 동일합니다. 참고: "rc=0"이 출력에 두 번 나타납니다.

$ output=$( output=$({ psql -c "select now()" 2>&1; echo rc=$?; } | cat); echo "$output" | grep 'rc=0'; rc2=$?; echo "$output"; exit $rc2 )
$ echo $?
0
$ echo "$output"
rc=0
              now              
-------------------------------
 2020-05-13 11:06:50.465941-04
(1 row)

rc=0
$ 

관련 정보