我正在尝试从外壳运行命令,而无需实际切换用户或手动登录数据库(因此外壳不会因询问密码而中断)
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;\""
到目前为止,一切都很好,但是当尝试将票务数据库连接到一行以使其自动化时,运行
后,它根本无法正常工作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
但是这会阻止外壳形式实际上“自动”出现
答案 0 :(得分:0)
欢迎来到反斜杠地狱!您需要在uuid-ossp
周围的双引号前面加上三个反斜杠,以获得正确的输出:
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;"
答案 1 :(得分:0)
您有点引述地狱。最内层的引号不会转义,并且会消失。将一些单引号添加到组合中:
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__