Bash

如何將 psql 錯誤消息輸出保存在 bash 變數中?

  • May 13, 2020

我有一個執行幾個不同 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 變數中?

你不能,直接。至少,不是沒有將其與標準輸出混合或丟棄。不過,有辦法!

#!/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

這會擷取標準輸出和標準錯誤,但隱藏退出程式碼。

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

引用自:https://unix.stackexchange.com/questions/370283