我正在完成这里的 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