我正在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语句中运行其他命令,但如果不成功,则不希望这样做。>
答案 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"