如何将 psql 错误消息输出保存在 bash 变量中?

如何将 psql 错误消息输出保存在 bash 变量中?

我有一个运行多个不同 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 命令失败,这将返回非零退出代码。注意:这是 grep 的退出代码,而不是 psql 的退出代码。在这种情况下,值是相同的,但这只是巧合。

$ 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 命令,返回零退出是相同的。注意:“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
$ 

相关内容