我注意到,当我不指定要grep
搜索的文件列表时,grep
比指定文件名时要慢得多(即使列表是*
,即目录中的所有文件)。
-R
当使用选项时,这似乎不会发生(grep -R pattern
与 一样快grep -R pattern *
)。
grep -R pattern
我养成了在没有输入文件列表的情况下调用的坏习惯。我现在正在使用grep pattern
,我想知道:
当命令无效时,幕后会发生什么来发出grep -R pattern
有效命令?grep pattern
或者,换句话说,两者有什么区别
grep -R pattern
grep -R pattern *
grep pattern
答案1
GNUgrep
以及 的一些其他实现grep
都有一个非标准-R
选项,使其递归地搜索给定的文件和目录。
如果使用grep
时在命令行上没有指定其他文件或目录,则GNU 实现隐式使用当前目录。-R
grep -R PATTERN
因此与
grep -R PATTERN .
grep -R PATTERN *
这与当前目录中没有隐藏文件或已dotglob
在 中设置 shell 选项的情况相同bash
。如果不在dotglob
中设置 shell 选项bash
,*
命令行上的模式将仅扩展为非隐藏名称。
其他grep
实现不会.
隐式使用 with,-R
即使这看起来像是一个合理的默认值,因为递归 grep 标准输入没有什么意义。
以grep
OpenBSD 为例:
$ grep -R PATTERN
grep: warning: recursive search of stdin
grep
在没有-R
输入文件和没有输入文件的情况下运行都会使实用程序读取标准输入。所有grep
实现都这样做,因为这就是POSIX 说实用程序应该做。
因此,运行(完全有效)命令
grep PATTERN
没有输入文件将等待grep
来自终端的输入。它将等待输入,直到您使用 发出输入结束信号
Ctrl+D或使用 中断该过程Ctrl+C。
从标准输入流读取和在目录结构中递归搜索匹配模式是互斥的操作。这样做没有什么意义
somecommand | grep -R PATTERN
然而
somecommand | grep PATTERN
是完全合理的。