默认情况下,grep -r在哪里搜索?


16

我发现如果我使用grep搜索时没有指定路径,就像grep -r 'mytext'它需要无限长的时间。同时,如果我使用指定的路径搜索,grep -r 'mytext' .它会立即找到我需要的东西。所以,我很好奇,第一种形式是grep在哪个目录中搜索?

UDATE:grep版本:grep(GNU grep)2.10


3
尝试键入内容,foomytextbar然后在运行后输入(后面按Enter)grep -r 'mytext'
sr_

2
也许您应该指定那grep是什么国王。随着GNU grepLinux上我用grep -r 'mytext'grep -r 'mytext' .做同样的事:递归搜索从当前目录开始。使用-r开关时,GNU grep 不会搜索STDIN。
manatwork 2012年

2
啊。我用grep2.12 进行了测试:pastebin.com/L4my26QS同时,我在有关版本2.11(2012-03-02)的NEWS文件中发现了此问题:“如果未提供文件操作数,并且给出了命令行-r或等效选项,现在grep会搜索工作目录。以前,grep忽略-r并以非递归方式搜索标准输入。在GREP_OPTIONS中找到的-r不会产生新的效果。”
manatwork 2012年

3
GNU grep最近使用-r参数更改了行为(请参阅commit)。因此,带有较新grep的“ grep -r PATTERN”将搜索当前目录而不是STDIN。
hluk 2012年

2
@Mikel,我用grep版本更新了我的问题。看来我指出正确的答案确实是正确的,因为我使用的是“旧” grep。因此,是否指定-r无关紧要,如果没有提供目录,它将在STDIN中搜索。顺便说一句,感谢您的调查,现在,我将知道grep的未来变化;)

Answers:


24

实际上,它不会在任何地方搜索。它等待来自标准输入的输入。

尝试这个:

beast:~ viroos$ grep foo

当您键入包含“ foo”的行并按回车键时,将重复此行,否则光标将移至新行,但grep将不会打印任何内容。


6
正如我在上面grep -r PATTERN用较新版本的GNU 注释的那样,grep不会读取标准输入,而是在当前目录中搜索模式(请参阅commit)。由于您在指定-r标志时可能不想搜索标准输入,因此此更改很有意义。
hluk 2012年

我检查了我的grep版本,它是2.10,所以这个答案非常有用。顺便说一句,现在,我将知道从新版本的grep开始等待什么。

3

就像Maciek先前的回答所说:

实际上,它不会在任何地方搜索。它等待来自标准输入的输入。

但是,如果您可以通过将数据传递到第0个第一个描述符中来使/ proc可用,则可以将其写入已经运行的程序的stdin中:

在一个终端运行

grep "hello"

并看到它无限期地等待...在另一个终端中键入:

echo "hello $USER" > /proc/`pgrep grep`/fd/0

看到第一个终端打印你好和您的用户名。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.