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
相关产品推荐
相关产品推荐

