当“grep -R 模式”不是有效命令时,幕后会发生什么?

当“grep -R 模式”不是有效命令时,幕后会发生什么?

我注意到,当我不指定要grep搜索的文件列表时,grep比指定文件名时要慢得多(即使列表是*,即目录中的所有文件)。

-R当使用选项时,这似乎不会发生(grep -R pattern与 一样快grep -R pattern *)。

grep -R pattern我养成了在没有输入文件列表的情况下调用的坏习惯。我现在正在使用grep pattern,我想知道:

当命令无效时,幕后会发生什么来发出grep -R pattern有效命令?grep pattern

或者,换句话说,两者有什么区别

  1. grep -R pattern
  2. grep -R pattern *
  3. 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 标准输入没有什么意义。

grepOpenBSD 为例:

$ 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

是完全合理的。

相关内容