为什么这两个命令是等效的(或者根据我得到的结果看来是等效的)?我认为第一个命令不起作用,因为它将*
被视为 glob 运算符,但它被传递到grep
很好并解释为正则表达式模式。
git diff master | grep \\+.*TODO
git diff master | grep \\+.\*TODO
答案1
仅当当前目录中有匹配的文件时,文件名 glob 才会被扩展 - 否则(除非任何nullglob
或failglob
shell 选项)它将按原样传递。所以:
$ echo \\+.*TODO
\+.*TODO
$ printf '+foo\n+TODO\n+bar' | grep \\+.*TODO
+TODO
但
$ touch '\+.abcTODO'
$ echo \\+.*TODO
\+.abcTODO
$ printf '+foo\n+TODO\n+bar' | grep \\+.*TODO
$ printf '+foo\n+TODO\n+bar' | grep \\+.\*TODO
+TODO