3

我最近一直在使用 egrep 命令(只是出于对 grep 的偏好),我注意到一种我不完全理解的行为。当我在我的主目录中运行以下命令时: egrep -r "main" * 它会执行我期望的操作并返回所有包含“main”的行和相应的文件。

虽然如果我输入: egrep -r "main" 并且忘记把星星放在最后,它似乎只是永远挂着。我希望有人能够阐明为什么会这样以及它在做什么?

谢谢 :)

4

3 回答 3

7

它正在等待stdin来自手册页的输入,因为您没有指定文件名grep

NAME
   grep, egrep, fgrep - print lines matching a pattern

SYNOPSIS
   grep [options] PATTERN [FILE...]
   grep [options] [-e PATTERN | -f FILE] [FILE...]

DESCRIPTION
   Grep searches the named input FILEs (or standard input if no files
   are named, or the file name - is given) for lines containing a
   match to the given PATTERN.  By default, grep prints the matching lines.
于 2013-02-01T20:52:56.987 回答
4

grep(或 egrep)需要知道要搜索的文件。通过包含*,您是在告诉它搜索当前目录中的所有文件。

如果您不包含*,它不知道在哪里查找,因此它会等待您的输入,并会提示您输入进行搜索(输入,然后按 ctrl+d 终止标准输入模式)。

这种行为并不是 grep 独有的。任何需要输入的命令都希望输入来自文件或标准输入 (stdin)。

标准输入数据可以来自管道,也可以在输入命令后在提示符下手动输入(当您认为它已挂起时,您会看到)。正如我所提到的,按 Ctrl+D 将使您退出该输入模式。

于 2013-02-01T20:55:18.180 回答
3

您没有提供路径,因此 grep 等待stdin数据。

路径示例:

egrep -r "pattern" .<- 在当前目录和子目录中搜索

cat file | egrep "pattern"<- 从管道中搜索数据

于 2013-02-01T20:52:12.743 回答