psql -v ON_ERROR_STOP=1不工作,无法终止脚本执行



我有一个bash脚本,调用另一个包含psql命令的脚本,我想在psql命令失败时停止执行。以下psql调用执行postgres函数。在下面的脚本中,echo $exitcode总是返回0,即使脚本调用postgres函数返回错误。我希望psql命令返回正确的错误代码,所以我可以在下面的脚本中正确处理它。FirstScript:

list=`sh /opt/dbb_promo_list.sh -60 -30`
ID_LIST=`echo $list |sed 's/[a-z _-]*//g'|sed 's/(.*//g'`
exitcode=$? 
echo $exitcode //always returns 0 both in successful and error case, i want it to return corresponding exit code for error, so i can handle it and stop the script.
if [ $exitcode -ne 0 ] ; then
echo "There seems to have errors while running script "
echo "Exit code is : "$exitcode
exit 1
fi

dbb_promo_list.sh:该脚本包含以下命令

psql -U $DB_USERNAME -h $DB_HOST -p $DB_PORT -d $DATABASE -c "SELECT schema.${PROCEDURE}($day_begin,$day_end)"

调用上述命令时在下面抛出错误。由于抛出这个错误,psql命令不应该返回退出代码0,但事实并非如此,即使postgres函数工作正常或返回如下错误,它也会返回0。我不确定是否有一种方法来调整bash脚本以识别抛出的错误

ERROR:  function string_agg(numeric, unknown) does not exist
LINE 1: SELECT string_agg(pmotn_id, ',')               FROM ppcapr.p...
^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

sql函数失败时。然后,它在控制台上报告错误,但继续执行脚本的其余部分。但我希望脚本执行终止一旦错误发生。

有什么建议吗?

$?变量保存最后执行的命令退出代码。

在您的代码中,exitcode=$?行之前执行的最后一个命令是sed 's/(.*//g',而不是psql命令。只要把这一行往上移就可以解决问题。

注:我知道这是一个老问题,但有人可能会从答案中受益。

相关内容

  • 没有找到相关文章

最新更新