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 コマンドが失敗すると、ゼロ以外の終了コードが返されます。注:これは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」が出力に2回表示されます。

$ 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
$ 

関連情報