为什么 `psql --file` 会误解波浪符号?

为什么 `psql --file` 会误解波浪符号?

之前我使用 pg_dump 在我的主目录中创建了一个名为 book_dump.sql 的数据库备份。

我想将备份恢复到名为 book 的空数据库。

为了恢复备份,我尝试了这个命令:

psql book --file=~/book_dump.sql

失败并显示以下消息:

~/book_dump.sql: No such file or directory

我再次尝试使用绝对路径:

psql book --file=/home/user/book_dump.sql

这次成功了。

我尝试在--file等号后使用空格代替:

psql book --file ~/book_dump.sql

这也有效。

当我使用等号时,为什么波浪号不起作用?

这是 psql 特有的问题吗,还是 Linux 的问题?

我可以改变一些东西让它按照我预期的方式工作吗?

答案1

负责扩展字符的是 shell(而不是 psql)~

假设是 bash,请参见http://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html

如果单词以未加引号的波浪符号 ('~') 开头,则直到第一个未加引号的斜杠的所有字符(如果没有未加引号的斜杠,则为所有字符)均被视为波浪符号前缀

波浪符号前面加等号在某种程度上是一种特殊情况。他们说:

每次变量赋值时,都会检查紧跟在“:”或第一个“=”后面的未加引号的波浪号前缀。在这些情况下,还会执行波浪号扩展。因此,可以在 PATH、MAILPATH 和 CDPATH 的赋值中使用带波浪号的文件名,然后 shell 会分配扩展的值。

--file=~/foo不是变量赋值,因此不应用波浪号扩展。我猜--file=$HOME/foo应该改用。

另一方面,file=~/foo作为命令确实分配/home/user/foo$file

另外我看到尽管它不是一个任务,但它echo bar=~/foo也会输出,上面的规则中显然存在一些模糊因素。bar=/home/daniel/foo

相关内容