bash脚本 - 如何正确处理或捕获失败的数据库连接的错误

时间:2017-02-16 04:22:26

标签: bash shell unix

我正在编写一个bash / shell脚本,该脚本具有psql数据库连接,程序失败并显示psql: FATAL: database "foo" does not exist。这很好,因为程序退出是因为它不存在,但我想要做的是陷阱或捕获FATAL消息,或许可以回应或做其他事情。

如同message == "database "foo" does not exist;然后回声或运行另一个函数。

这是我执行数据库连接的代码行:

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

我可以举例说明如何做到这一点吗?感谢。

1 个答案:

答案 0 :(得分: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
}

您正在脚本中运行命令,并且不想重定向到/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)

现在,无论您以前做过什么,都可以使用非失败命令的输出。您可能还想在某个时刻用exec 10>&-关闭fd#10。

定义函数对于摆脱$PSQL变量也很有用。我们中的许多人遵循变量用于值,命令函数的原则,并且有理由不将命令存储到变量中,但这与您的问题无关,而且更多的是品味。 ..

另见thisthis SO question