You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

bash脚本中psql插入成功但报127错误,寻求解决方法

解决bash脚本中psql执行后出现“INSERT: command not found”的错误

嘿,我明白你现在的困扰啦!你遇到的这个错误根源在于**用反引号()包裹psql命令**的方式不对——反引号的作用是把命令的输出结果当作bash命令来执行,而你的psql在执行INSERT语句后,哪怕加了-t参数(去掉表头和footer),可能还是输出了包含INSERT`的文本内容,bash看到这个输出就误以为是要执行的命令,自然就报错“INSERT: command not found”了。

而且其实你根本不需要用反引号来执行psql命令,直接运行psql即可,这样既不会触发错误,还能正常获取命令的退出码。另外补充个小细节:你脚本里的\q是多余的,当psql读到EOF标记后会自动退出,不用手动输入退出命令。

这是修正后的代码片段:

L_SQL="INSERT INTO consumer.RAKESH_TEST(num_col1, text_col2) VALUES(2,'TWO');"
psql -t -h ${HOSTNAME} -d ${SRCDATABASE} -U ${SRCUSER} -v "ON_ERROR_STOP=1" <<EOF
${L_SQL}
EOF
SQL_ERROR=$?

咱们来解释下改动点:

  • 去掉了包裹psql命令的反引号,让psql直接作为bash命令执行,它的输出只会打印到终端(或者你可以重定向到/dev/null如果不需要看输出),不会被当作命令执行
  • 移除了多余的\q命令,简化脚本
  • SQL_ERROR=$?依然能正确获取psql命令的退出状态码:如果插入成功,$?会是0;如果执行出错(比如语法错误、权限问题),会返回非0值,完全符合你的需求

另外再提个小建议:如果不想看到psql的输出,可以在psql命令后面加上>/dev/null 2>&1,这样所有输出都会被丢弃,脚本运行更干净:

psql -t -h ${HOSTNAME} -d ${SRCDATABASE} -U ${SRCUSER} -v "ON_ERROR_STOP=1" <<EOF
${L_SQL}
EOF >/dev/null 2>&1
SQL_ERROR=$?

内容的提问来源于stack exchange,提问作者Rakesh

火山引擎 最新活动