psql返回值/错误终止了调用它的shell脚本?

时间:2019-11-21 01:04:14

标签: bash postgresql psql

我正在bash shell脚本中运行多个psql命令。其中一个命令将csv文件导入到表中。问题是,CSV文件偶尔会损坏,结尾处包含无效字符,并且导入失败。当发生这种情况并且我设置了ON_ERROR_STOP=on标志时,我的整个shell脚本也将在那一刻停止。

这是我的bash脚本的相关内容:

$(psql \
-X \
 $POSTGRES_CONNECTION_STRING \
-w \
-b \
-L ./output.txt
-A \
-q \
--set ON_ERROR_STOP=on \
-t \
-c "\copy mytable(...) from '$input_file' csv HEADER"\
)

echo "import is done"

只要csv文件未损坏,上述方法都可以正常工作。如果是这样,ps​​ql会向控制台发出一条消息,消息以ERROR: invalid byte sequence for encoding "UTF8": 0xb1开始,此时我的bash脚本显然停止了运行-我上面的echo语句没有执行,并且其他任何也不执行后续命令。

根据psql文档,psql中的硬停止应该返回错误代码3:

  

如果正常完成,psql将向外壳返回0,如果自身发生致命错误(例如,内存不足,找不到文件),则返回1,如果与服务器的连接断开并且会话未>,则返回2。交互式,如果脚本中发生错误并且设置了变量ON_ERROR_STOP,则为3

这很好,但是返回值3应该终止我的调用bash脚本吗?我可以防止吗?我想将ON_ERROR_STOP设置为on,因为如果初始导入成功,实际上我想在该psql语句中运行其他命令,但如果不成功,则不希望这样做。

1 个答案:

答案 0 :(得分:1)

ON_ERROR_STOP不能与-c选项一起使用。

此外,$(...)周围的psql看起来是错误的-您是否要以命令的形式执行输出?

最后,您在-L选项之后忘记了反斜杠

尝试使用“此处文档”:

psql \
  -X \
  $POSTGRES_CONNECTION_STRING \
  -w \
  -b \
  -L ./output.txt \
  -A \
  -q \
  --set ON_ERROR_STOP=on \
  -t <<EOF
\copy mytable(...) from '$input_file' csv HEADER
EOF

echo "import is done"
相关问题