Bash shell 连接到数据库,运行 来自 PSQL 的查询给出了未知用户:

Bash shell to connect to a DB and run a query from in PSQL gives an unknown user:

我正在尝试 运行 从 shell 一个命令,而不实际切换用户或手动登录数据库(因此 shell 不会被打断询问密码)

CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;

我期待 运行 在数据库中使用用户 ticketng

进行票务

我已经设置并运行了 .pgpass 文件以及创建了 psql DB 用户票证

sudo -H -u postgres bash -c "cd && psql -c \"CREATE ROLE ticketing LOGIN CREATEDB;\""
sudo -H -u postgres bash -c "cd && psql -c \"ALTER USER ticketing WITH PASSWORD 'testpass';\""
sudo -H -u postgres bash -c "cd && psql -c \"CREATE DATABASE ticketing WITH ENCODING='UTF8' OWNER=ticketing CONNECTION LIMIT=-1;\""
sudo -H -u postgres bash -c "cd && psql -c \"ALTER USER ticketing WITH SUPERUSER;\""

到这里一切都很好,但是当尝试将票务数据库连接到单行中以自动执行此操作时,它根本不起作用,在 运行ning

之后
sudo -H -u ticketing bash -c "cd && psql -c \"CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;\""

我得到一个:

sudo:未知用户:票务

sudo: 无法初始化策略插件

我想要实现的目标可以通过 运行手动执行以下几行

psql -h localhost -U ticketing
CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;
\q

然而,这会阻止 shell 表格实际生成 "automatic"

欢迎来到反斜杠地狱!您需要在 uuid-ossp 周围的 double-quote 前添加三个反斜杠以获得正确的输出:

sudo -H -u ticketing bash -c "cd && psql -c \"CREATE EXTENSION IF NOT EXISTS \\"uuid-ossp\\" WITH SCHEMA public;\""

因为:

bash-3.2$ echo "cd && psql -c \"CREATE EXTENSION IF NOT EXISTS \\"uuid-ossp\\" WITH SCHEMA public;\""

cd && psql -c "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\" WITH SCHEMA public;"

您有点引用不当。最里面的引号未转义并将消失。加入一些单引号:

sudo -H -u ticketing bash -c "cd && psql -c 'CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\" WITH SCHEMA public;'"
# ...........................1..............2...............................3...........3....................21

或者使用一个非常整洁的 heredoc:

sudo -H -u ticketing bash <<__END__
cd && psql -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;'
__END__