【问题标题】:psql return value / error killing the shell script that called it?psql 返回值/错误杀死调用它的 shell 脚本?
【发布时间】: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 文件没有损坏,上述操作就可以正常工作。但是,如果是这样,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 语句中运行其他命令,但如果没有,则不会。

【问题讨论】:

    标签: bash postgresql psql


    【解决方案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"
    

    【讨论】:

    • 很抱歉,sn-p 中 -L 之后缺少反斜杠,它实际上在我的脚本中,不确定在 sn-p 中转录它时它是如何“消失”的。至于$() 位,我最初是在捕获(或尝试)来自psql 的返回值,如下所示:ret_val=$(psql... 这不起作用,因为当 psql 发生时整个脚本都死了。
    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2020-11-30
    • 2014-05-04
    • 2017-01-23
    • 1970-01-01
    • 2011-11-14
    • 2020-09-04
    相关资源
    最近更新 更多