2017-02-16 9 views
0

psqlデータベース接続を持つbash/shellスクリプトを作成していて、プログラムはpsql: FATAL: database "foo" does not existで失敗します。これは、プログラムが存在しないので終了するので、これは問題ありませんが、私が代わりにやりたいのは、そのメッセージFATALをトラップしてキャプチャし、おそらくエコーや他のことをすることです。bashスクリプト - 失敗したデータベース接続のエラーを適切に処理またはトラップする方法

Like If message == "database "foo" does not exist;エコーするか、別の機能を実行します。ここで

は、DB接続を行うコードの私のラインです:

PGPASSWORD=$TARGET_PW "$PSQL" -h "$HOST2" -U masteruser -d "$database" -p 5439 << EOF 
     \a 
     \t 
     \o $LISTNEW 
    SELECT column_name 
    FROM information_schema.columns 
    WHERE table_schema = '$SCHEMAMAIN' 
    AND table_name = '$TBL' 
    order by ordinal_position; 
EOF 

は、私がこれを行う方法の一例を得ることができますか?ありがとう。

答えて

2

編集されたバージョン

変数にコマンドのstderrはそう

errMsg=$(some_command 2>&1 >/dev/tty) 

でリダイレクトするための最良の方法、わかりやすくするために、私はあなたの元のコードの周りの関数を定義し

function my_psql() { 
PGPASSWORD=$TARGET_PW "$PSQL" -h "$HOST2" -U masteruser -d "$database" -p 5439 << EOF 
     \a 
     \t 
     \o $LISTNEW 
    SELECT column_name 
    FROM information_schema.columns 
    WHERE table_schema = '$SCHEMAMAIN' 
    AND table_name = '$TBL' 
    order by ordinal_position; 
EOF 
} 

あなたはコマンドをscriで実行していますptになり、/dev/ttyにリダイレクトしたくありません。したがって:

# Save the script’s stdout in fd #10 
exec 10>&1 
# my_psql sends its stderr to the variable and its stdout to fd #10 
errMsg=$(my_psql 2>&1 1>&10) 

これで、以前に行ったことのないコマンドの出力ができます。ある時点でfd#10をexec 10>&-で閉じることもできます。

関数を定義すると、変数$PSQLを取り除くこともできます。私たちの多くは、の変数は値のためのものであり、コマンドの関数はであり、実行するコマンドを変数に格納しない理由がありますが、これはあなたの質問とは無関係であり、より多くの味覚の問題になります...

も参照してください。this およびthis SO question

関連する問題