我正在尝试使用以下命令导入 mysql 数据库:
mysql -u root -p poolstore < /home/algolix/Downloads/poolstore_co_uk_primary.sql
但我不能,它说:
没有这样的文件或目录
但是,当我使用以下方式访问它时:
mysql -u root -p poolstore < /home/algolix/Downloads/poolstore_co_uk_primary\ .sql
有用。
那么为什么我需要使用反斜杠?
答案1
您的文件名在点之前包含一个空白字符,需要用反斜杠进行转义,否则它会开始一个新参数。
您的第一个命令尝试打开文件poolstore_co_uk_primary.sql
。
您的第二条命令访问文件poolstore_co_uk_primary .sql
。
显然这是两个不同的文件。显然第二个文件存在于您的系统中,而第一个文件不存在。
答案2
\
被称为转义字符是有原因的。
您的问题不言自明......您的文件名中有一个空格:
poolstore_co_uk_primary .sql
要写入/读取此类文件,您需要转义空格(多个空格需要多个转义字符(每个一个)正如你所做的那样:
poolstore_co_uk_primary\ .sql
或者像这样引用文件名:
'poolstore_co_uk_primary .sql'
因为,如果不使用上述任何一种方法,在命令行中直接提供文件名,shell 就会将其(在空格处)拆分为两个文件名:
poolstore_co_uk_primary
和
.sql
并删除空格(就像您在第一个命令中所做的那样)将导致完全不同的第三个文件名。
答案3
在调用命令之前,shell(例如 bash)会执行几项操作之一,即对输入进行分段。这通常是根据空格字符进行的。例如,
ls projects personal shared
将被分为四个部分:ls
、projects
和。第一部分通常被解释为要调用的命令,其余部分是参数。因此,上面的命令行将使用三个参数personal
进行调用。shared
ls
如果其中一个参数包含空格字符,则此分段会出错。假设您要列出名为“新项目”的目录的内容。命令行
ls new projects
将被分割成ls
、new
和projects
。 shell 无法知道您实际上想要的是ls
和new projects
。
正如其他答案已经提到的,有多种方法可以表示空格字符不是输入部分之间的分隔符。一种方法是用反斜杠屏蔽空格字符
ls new\ projects
另一种方法是引用整个片段
ls "new projects"
ls 'new projects'
您要导入的数据库转储的文件名似乎包含空格字符。因此(使用简化的示例),
mysql < poolstore .sql
将被解释为、 和mysql
。<
但是您需要、和。因此您需要“告诉”您的 shell 不要在该特定空白字符上进行分段。poolstore
.sql
mysql
<
poolstore .sql