You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL Shell脚本执行异常求助:仅`sudo su postgres`生效,后续数据库检查与创建语句未执行

解决sudo su postgres后后续命令不执行的问题

我来帮你搞定这个问题!核心原因是:当你执行sudo su postgres时,它会启动一个全新的交互式Postgres用户shell,你的原脚本会暂停,直到你手动退出这个shell才会继续执行后面的psql命令——但那时候已经回到原来的用户身份了,自然没法正确执行Postgres的操作。

下面给你几种可行的解决方案:

方案1:用sudo -u postgres直接执行命令(推荐)

不需要切换shell,直接以postgres用户身份运行后续的命令串,这是最简洁可靠的方式:

#!/bin/sh
sudo -u postgres bash -c "psql -tc \"SELECT 1 FROM pg_database WHERE datname = 'test_db'\" | grep -q 1 || psql -c \"CREATE DATABASE test_db\""

这里用bash -c把整个命令串包起来,注意内部的引号要转义,确保命令能被正确解析。另外,postgres用户默认连接的就是同名数据库用户,所以可以去掉-U postgres参数,进一步简化命令。

方案2:使用Here Document传递命令给su

如果你一定要用su,可以通过here-doc让su执行完指定命令后自动退出,而不是进入交互式shell:

#!/bin/sh
sudo su postgres <<EOF
psql -tc "SELECT 1 FROM pg_database WHERE datname = 'test_db'" | grep -q 1 || psql -c "CREATE DATABASE test_db"
EOF

这种方式会让su读取EOF之间的内容并执行,执行完成后自动回到原用户,脚本可以继续往下运行。

方案3:用su -c传递单个命令串

把后续的命令用su -c直接传进去,避免进入交互式shell:

#!/bin/sh
sudo su postgres -c "psql -tc \"SELECT 1 FROM pg_database WHERE datname = 'test_db'\" | grep -q 1 || psql -c \"CREATE DATABASE test_db\""

和方案1类似,只是通过su而非sudo直接指定用户,但sudo已经帮你切换到root再执行su,效果差不多,不过方案1的写法更直接。

额外小提示:

脚本开头的#!/bin/sh +x意义不大,+x是关闭调试模式的参数,如果你想开启脚本调试,可以改成#!/bin/sh -x,不过这个不影响核心问题的解决。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:22:46