【发布时间】:2020-03-16 20:13:30
【问题描述】:
我在 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 文件没有损坏,上述操作就可以正常工作。但是,如果是这样,psql 会向控制台发出一条以 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 语句中运行其他命令,但如果没有,则不会。
【问题讨论】:
标签: bash postgresql psql