我正在编写一个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
我可以举例说明如何做到这一点吗?感谢。
答案 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
变量也很有用。我们中的许多人遵循变量用于值,命令函数的原则,并且有理由不将命令存储到变量中,但这与您的问题无关,而且更多的是品味。 ..
另见this 和this SO question。