外壳扩展未发生

外壳扩展未发生

为什么这两个命令是等效的(或者根据我得到的结果看来是等效的)?我认为第一个命令不起作用,因为它将*被视为 glob 运算符,但它被传递到grep很好并解释为正则表达式模式。

git diff master | grep \\+.*TODO
git diff master | grep \\+.\*TODO

答案1

仅当当前目录中有匹配的文件时,文件名 glob 才会被扩展 - 否则(除非任何nullglobfailglobshell 选项)它将按原样传递。所以:

$ 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

相关内容