【问题标题】:bash scripting - how to properly handle or trap errors for failed database connectionsbash 脚本 - 如何正确处理或捕获数据库连接失败的错误
【发布时间】:2017-02-16 14:56:42
【问题描述】:

我正在编写一个具有psql 数据库连接的 bash/shell 脚本,但程序失败并显示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

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

【问题讨论】:

    标签: bash shell unix


    【解决方案1】:

    修改后的版本

    将命令的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&gt;&amp;- 关闭fd #10。

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

    另见thisthis SO question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-10
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2019-03-24
      相关资源
      最近更新 更多