我正在尝试使用多个引号执行命令,但似乎有问题:
sudo su - postgres -c 'psql -U postgres -c "alter user postgres with password 'dummy';"'
ERROR: syntax error at or near "dummy"
LINE 1: alter user postgres with password dummy;
^
如果我分两步点击相同的命令,没有问题:
sudo su - postgres
postgres@courgette:~$ psql -U postgres -c "alter user postgres with password 'dummy';"
ALTER ROLE
如何正确引用一行中的“虚拟”首先例证?
答案 0 :(得分:5)
每the Bash Reference Manual, §3.1.2.2 "Single Quotes":
用单引号括起字符('
'
')会保留引号中每个字符的字面值。单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。
所以,你有三个合理的选择:
你可以退出单引号位,只需添加双引号单引号:
sudo su - postgres -c 'psql -U postgres -c "alter user postgres with password '"'"'dummy'"'"';"'
您可以使用双引号"..."
,在这种情况下,您必须转义任何内部双引号:
sudo su - postgres -c "psql -U postgres -c \"alter user postgres with password 'dummy';\""
您可以使用$'...'
(与'...
'和"..."
不同,因为它支持各种C风格的转义序列),在这种情况下,您必须逃避任何内部单引号:
sudo su - postgres -c $'psql -U postgres -c "alter user postgres with password \'dummy\';"'
答案 1 :(得分:2)
不要使用su
运行sudo
,而是直接运行psql
。这消除了一个级别的引号,以及需要使用-U
选项指定用户:
sudo -u postgres psql "alter user postgres with password 'dummy';"
如果由于某种原因无法做到这一点,请使用此处的文档来消除引用级别:
sudo su - postgres -U postgres <<EOF
alter user postgres with password 'dummy'
EOF