'*.txt' 和 *.txt 有什么区别?

For*_*une 0 shell git quoting wildcards

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

它说我必须在 *.txt 周围加上单引号。我以前在使用 linux 时没有见过这个,但认为它很奇怪。我还看到在使用 html 和 php 时使用单引号来确保按字面解释字符串而不是使用特殊字符。

Kus*_*nda 7

这在 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 addunexpanded。如果发生这种情况,结果将与引用模式相同。

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


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

通配符:

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

  • 值得注意的是,当 shell 进行文件名匹配并匹配 *nothing* 时,`git add` 将得到 `*.txt`,就像你运行 `git add '*.txt'` 一样。如果这是您想要的,您可能会认为您这样做是正确的,直到有一次当前目录中有匹配的文件时,整个行为都会发生变化,而您不知道是什么击中了您。 (2认同)
  • @Kamil,仅在尚未修复的外壳中。请参阅 `zsh`/`fish`/`tcsh` 以获得更好的行为(以及 `bash` 中的 `failglob` 选项)。另一个问题是,如果当前目录中有一个名为 `*.txt` 的文件,一个未加引号的 `*.txt` 将扩展到该文件和其他 `.txt` 文件,并且 `git` 会做另一轮不同的通配符解释。 (2认同)