“*.txt”和*.txt 有什么区别?

“*.txt”和*.txt 有什么区别?

我正在完成这里的 git 教程: https://try.github.io/levels/1/challenges/7

它说我必须在 *.txt 两边加上单引号。我以前在使用 Linux 时没有见过这个,但觉得很奇怪。我在使用 html 和 php 时也看到过单引号,以确保字符串按字面解释而不是使用特殊字符。

答案1

这在 shell 中与您提到的其他语法相同。单引号字符串将被视为“字符串文字”(可以这么说)。

git add '*.txt'和之间的区别git add *.txt在于谁在对文件名进行模式匹配。

在 的情况下git add '*.txt'git正在进行模式匹配。由于 shell 不会扩展字符串文字'*.txt',git add将使用单个参数 来调用*.txt. git然后与可用的文件名进行匹配在整个存储库中(因为... git)。

如果是git add *.txt,shell 执行文件名匹配并将传递匹配文件名的列表从当前目录git add。请注意,如果没有与给定模式匹配的名称,shell 将(通常为1)将该模式传递给git add未展开的模式。如果发生这种情况,结果将与引用模式相同。

1 通常,但请参见例如failglob中的 shell 选项bash。另请参阅对此答案的评论。


git add获取文件名时图案,它不仅会添加当前目录中匹配的文件,还会添加整个存储库中匹配的所有文件(即包括任何子目录)。这就是为什么右下角的文字说

通配符:

我们需要引号,以便 Git 在我们的 shell 干扰它之前接收通配符。如果没有引号,我们的 shell 将仅在当前目录中执行通配符搜索。 Git 将接收 shell 找到的文件列表而不是通配符,并且它将无法添加 octofamily 目录内的文件。

答案2

单引号可防止 shell 进行通配符和变量扩展,但双引号仅可防止通配符,不能防止变量扩展。

*.txt将通过 shell 扩展并列出所有.txt文件。但引用'*.txt'会阻止它。请参阅下面的示例。

echo *.txt
a.txt b.txt c.txt

echo '*.txt'
*.txt

相关内容