之前我使用 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