
いくつかの異なる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
$