为什么我需要使用反斜杠或转义字符才能访问 sql 文件,即“/home/algolix/Downloads/poolstore_co_uk_primary\ .sql”

为什么我需要使用反斜杠或转义字符才能访问 sql 文件,即“/home/algolix/Downloads/poolstore_co_uk_primary\ .sql”

我正在尝试使用以下命令导入 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

将被分为四个部分:lsprojects和。第一部分通常被解释为要调用的命令,其余部分是参数。因此,上面的命令行将使用三个参数personal进行调用。sharedls

如果其中一个参数包含空格字符,则此分段会出错。假设您要列出名为“新项目”的目录的内容。命令行

ls new projects

将被分割成lsnewprojects。 shell 无法知道您实际上想要的是lsnew projects

正如其他答案已经提到的,有多种方法可以表示空格字符不是输入部分之间的分隔符。一种方法是用反斜杠屏蔽空格字符

ls new\ projects

另一种方法是引用整个片段

ls "new projects"
ls 'new projects'

您要导入的数据库转储的文件名似乎包含空格字符。因此(使用简化的示例),

mysql < poolstore .sql

将被解释为、 和mysql<但是您需要、和。因此您需要“告诉”您的 shell 不要在该特定空白字符上进行分段。poolstore.sqlmysql<poolstore .sql

相关内容